Можно ли использовать orderBy
для связанных с объектом моделей? То есть, скажем, у меня есть модель блога с 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');
}