Как мне вызвать `with` непосредственно для объекта, который был выбран по маршруту с такими же результатами, как если бы он был выбран через` где`? - PullRequest
0 голосов
/ 30 мая 2019

Как мне вызвать with непосредственно для объекта, который был автоматически выбран по маршруту с такими же результатами, как если бы он был выбран через where?

Позвольте мне объяснить через код!

Мой маршрут (одинаковый в обоих):

Route::get('post/{post}', 'PostsController@show');

Альтернатива 1:

Мой контроллер:

public function show(Post $post){
    $postWithComments = Post::where('id', $post->id)->with('comments')->first();
}

Вывод: комментарии к предполагаемому посту.

Альтернатива 2:

Мой контроллер:

public function show(Post $post){
    $postWithComments = $post->with('comments')->first();
}

Вывод: комментарии к первому из ВСЕХ сообщений.

Желаемый результат: аналогичен альтернативному.


Как я могу изменить запрос в альтернативе 2 для вывода так же, как в альтернативе 1? Я думаю, что нет необходимости сначала делать запрос where, так как объект уже загружен. Поэтому я думаю, что я хотел бы сделать это, чтобы уменьшить количество вызовов БД. Или я не так думаю?

1 Ответ

1 голос
/ 30 мая 2019

Есть два способа решить эту проблему:

  • Запрос данных, связанных с отложенная загрузка :

    $post->comments; // this did the trick - comments for post will queried here
    return $post;  // here posts already has comments collection
    
  • Настройка привязка модели и использование стремительная загрузка :

    В вашей Post модели добавить resolveRouteBinding метод:

    class Post extends Model 
    {
        public function resolveRouteBinding($id)
        {
            return $this->where('id', $id)->with(['comments'])->first();
        }
    }
    

    Тогда ваш контроллер получит экземпляр Post с уже загруженными комментариями

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...