Можно ли использовать 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'); }