Ошибка привязки модели маршрута 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);
});
Вот хороший пример, который может помочь.