#php #laravel #laravel-4 #blade
#php #laravel #laravel-4 #блейд
Вопрос:
Это мой контроллер
public function show($restaurant_id)
{
$data = Restaurant::find($restaurant_id)->waitingtimes();
echo $data->first()->value; exit;
Я получил Trying to get property of non-object
, хотя waitingtime
модель сопоставлена с таблицей базы данных, в которой есть value
столбец.
Не могли бы вы помочь, пожалуйста? Кроме того, не могли бы вы сказать мне, где я могу прочитать документацию о возвращаемом типе функции find()
, спасибо
Редактировать 1
Данные не пустые; Я вижу базу данных, и restaurant
таблица имеет идентификатор 20, а время ожидания таблицы имеет значения, restaurant_20
равные 20
Комментарии:
1. Документацию для find можно найти здесь
2. Вам нужно использовать Route::bind(), который позволит вам перехватить экземпляр, в котором не получен результат от маршрута, и сделать, т.е.
if(!$user) return App::abort(404);
вернуть ошибку 404 вместо ошибки, которую вы получаете…3. @JustinE Мне нужно напечатать переменную $data сейчас, а позже я обработаю ввод ошибки пользователя 🙂
Ответ №1:
На самом деле — что лучше, так это сопоставить маршрут с моделью.
Итак, в вашем Routes.php файл:
Route::model('restaurant', 'Restaurant');
Route::get('/restaurant/{restaurant}', ['as' => 'restaurant.show', 'uses' => RestaurantController@show]);
Затем в вашем файле контроллера:
public function show(Restaurant $restaurant)
{
echo $restaurant->waitingtimes()->first()->value;
}
Подробнее о привязке модели маршрута вы можете прочитать здесь.
Комментарии:
1. почему вы предположили, что я не направил модель на маршрут? 🙂 Я уже сделал это, и это не имеет никакого отношения к моей проблеме. Другими словами, проблема возникает, хотя карта существует
2. Вам нужно использовать Route::bind(), который позволит вам перехватить экземпляр, в котором не получен результат от маршрута, и сделать, т.е.
if(!$user) return App::abort(404);
вернуть ошибку 404 вместо ошибки, которую вы получаете…3. Кроме того, @AnastasieLaurent Вы не указали это в своем вопросе.
4. Также @AnastasieLaurent Если вы используете привязку модели маршрута, ваш код должен быть:
echo $restaurant_id->waitingtimes()->first()->value; exit;
поскольку $restaurant_id будет экземпляром вашего класса restaurant .5. @AnastasieLaurent Я предположил, что вы не используете привязку модели маршрута, потому что вы неправильно используете ее в своем контроллере. Посмотрите на мою функцию отображения контроллера. Он отличается от вашего. Вам нужно указать (Restaurant $restaurant). Тогда вам никогда не нужно будет «находить» Ресторан — Laravel предоставит его вам.
Ответ №2:
вот источник find() https://github.com/laravel/framework/blob/master/src/Illuminate/Database/Eloquent/Model.php#L643
и здесь у вас есть документы
http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Model.html#method_find
для вашей не-объектной ошибки,
ваш $data пуст, вы должны проверить это перед использованием $data collection
Комментарии:
1. данные наверняка не пустые, я вижу это в своей базе данных. если вы хотите, подскажите мне какое-либо утверждение для проверки данных и печати выходных данных.
Ответ №3:
Наконец я сам нашел решение, которое заключается в:
public function show($restaurant_id)
{
$data = new Restaurant(array('id' => $restaurant_id));
$data = $data->waitingtimes();
echo $data->first()->value; exit;