Ошибка привязки модели маршрута Laravel 5.2, приводящая к ошибке неизвестного столбца SQL

Я пытаюсь реализовать этот пакет - https://github.com/vinkla/hashids чтобы скрыть все идентификаторы в URL.

Я создал новую установку laravel 5.2 и создал одну модель под названием Orange.php с заполненной таблицей.

INSERT INTO `oranges` (`id`, `orange_name`) VALUES(1, 'test1'),(2, 'test2'),(3, 'test3');

Я добавил следующее в route.php-

Route::bind('id', function ($id, $route) {
return Hashids::decode($id)[0];
});

Route::resource('orange', 'OrangeController');

Route::model('orange', 'App\Orange');

Я также переопределил getRouteKey, добавив следующую функцию в Orange.php-

public function getRouteKey()
{
return Hashids::encode($this->getKey());
}

Таким образом, getRouteKey должен закодировать идентификатор для отображения URL-адреса, например, 3 переходит к hgfdh, тогда моя привязка маршрута должна быть применена через подстановочный знак 'id' к любому маршруту, используя параметр id для декодирования идентификатора для OrangeController.php в этом случае.

Я получил следующие две ошибки при попытке загрузить http://localhost:8000/orange/3-

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'orange_name:"test3"' in 'where clause'

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'orange_name:"test3"' in 'where clause' (SQL: select count(*) as aggregate from `oranges` where `orange_name` = test3 and `orange_name:"test3"` <> {"id":3 and `created_at:"2016-06-23 09:30:39"` = updated_at:"2016-06-23 09:30:39"})

Я думаю, что эта ошибка связана с

 Route::model('orange', 'App\Orange');

Он пытается связать экземпляр Orange вместо $id для Orange? Если да, то как я могу привязать $id?

если я закомментирую определение Route::model, я получу

NotFoundHttpException in Handler.php line 103:
No query results for model [App\Orange].

1 ответ

Laravel имеет механизм привязки "модель маршрута". Таким образом, в вашем маршруте вы можете ожидать запутанный идентификатор, но в bind метод, вы должны получить правильный model например, вот так:

Route::bind('orange', function($value)
{
    $id = Hashids::decode($value)[0];

    return Orange::findOrFail($id);
});

Вот хороший пример, который может помочь.

Другие вопросы по тегам