Попытка получить свойство не-объекта в контроллере

#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;