Заказ похожих моделей с Laravel / Eloquent

Можно ли использовать orderBy для связанных моделей объекта? То есть, допустим, у меня есть модель Blog Post с hasMany("Comments"); Я могу получить коллекцию с помощью

 $posts = BlogPost::all(); 

Затем пройдите через каждое сообщение и отобразите последнюю отредактированную дату комментария для каждого

 foreach($posts as $post) { foreach($post->comments as $comment) { echo $comment->edited_date,"\n"; } } 

Есть ли способ установить порядок возврата комментариев?

Возвращаемый объект из отношения – это экземпляр Eloquent, который поддерживает функции построителя запросов, поэтому вы можете вызвать на нем методы построения запросов.

 foreach ($posts as $post) { foreach ($post->comments()->orderBy('edited_date')->get() as $comment) { echo $comment->edited_date,"\n"; } } 

Кроме того, имейте в виду, когда вы foreach() все сообщения, подобные этому, что Laravel должен запускать запрос, чтобы выбирать комментарии для сообщений на каждой итерации, поэтому рекомендуется загружать комментарии, подобные тому, что вы видите в ответе Жарека Ткаччика .

Вы также можете создать независимую функцию для упорядоченных комментариев, как вы видите в этом вопросе .

 public function comments() { return $this->hasMany('Comment')->orderBy('comments.edited_date'); } 

И тогда вы можете их зацикливать, как в исходном коде.

Это правильный способ:

 BlogPost::with(['comments' => function ($q) { $q->orderBy('whatever'); }])->get(); 

Да:

 $posts = BlogPost::with('comments') ->orderBy('comments_table_name.column_name') ->get(); 

И вы также можете установить это в своих отношениях:

 public comments() { $this->hasMany("Comments")->orderBy('comments.column_name'); }