2015-12-02 2 views
0

Предположим, у меня есть модель Post, которая hasManyComment модель. Поэтому, чтобы получить комментарии, я бы сделал $post->comments.Яркая модель с вызовом внутри контроллера

На некоторых веб-сайтах, я видел, что люди делают это в контроллере:

$post = App\Post::with('comments')->findOrFail($id); 

return view('someview', compact('post')); 

, а затем внутри вида:

@foreach($post->comments as $comment) ...

В моем понимании, $post->comments будет всегда есть комментарии, и нет необходимости звонить with('comments'). Это неправильно?

Если да, то в чем разница между выше и ниже:

Контроллер

$post = App\Post::findOrFail($id); 

return view('someview', compact('post')); 

Посмотреть

@foreach($post->comments as $comment) ....

+0

С жадным загрузки вы получите более быстрое время отклика, и меньше нагрузки на сервер, а с другой стороны, второй подход вы бы иметь то, что называется N + 1 вопрос, где для каждой строки, вы должны запустить новый запрос посмотрите здесь: http://stackoverflow.com/questions/97197/what-is-the-n1-selects-issue – ahmad

ответ

1

Это называется жадная загрузка: http://laravel.com/docs/5.1/eloquent-relationships#eager-loading

Нежелательная загрузка не повлияет на ваш пример. Вот лучший вариант использования:

$posts = App\Post::orderBy('id')->take(10)->get(); 

foreach ($posts as $post) 
{ 
    echo $post->comments; 
} 

Eloquent создаст 11 запросов к базе данных, что не очень хорошо. 1 запрос для получения сообщений и 10 запросов для получения комментариев для каждого сообщения.

Когда вы хотите загрузить свои отношения, Eloquent выполнит только один запрос.

$posts = App\Post::with('comments')->orderBy('id')->take(10)->get(); 

foreach ($posts as $post) 
{ 
    echo $post->comments; 
} 

В этом примере будут созданы 2 запроса: 1, чтобы получить все сообщения, а другой - для комментариев к сообщениям.

select * from posts 

select * from comments where post_id in (1, 2, 3, 4, 5, ...) 
+0

Ах, верно! Так что я охотно загружаю загрузку, и теперь она проясняет все, спасибо! –

Смежные вопросы