Заказ связанных моделей с Laravel / Eloquent

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

$posts = BlogPost::all();

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

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

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

5

Решение

Возвращенный объект из отношения является экземпляром 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');
}

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

3

Другие решения

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

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

Да:

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

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

public comments()
{
$this->hasMany("Comments")->orderBy('comments.column_name');
}
-2
По вопросам рекламы [email protected]