Порядок построения запросов Laravel по полю связи

#laravel #eloquent #eloquent-relationship

#laravel #eloquent #eloquent-связь

Вопрос:

Я пытаюсь упорядочить по полю отношений следующим образом:

 Post::with(['comments' => function($query) {
    $query->orderBy('some_comment_field', 'desc');
}]);
  

Но это не работает. Как я могу это сделать?

Я использую Laravel 5.8.

Ответ №1:

если вы хотите упорядочить по полям комментариев, вам следует добавить его в основной выбор с помощью объединения:

 Post::with(['comments'])->join('comments','posts.id','comments.post_id')
->select(['posts.*','comments.some_comment_field'])
->orderby('comments.some_comment_field', 'desc')->get();
  

вы можете опустить комментарии, требующие загрузки, и выбрать нужное поле комментариев. Вы также можете использовать псевдонимы, чтобы получить четкие имена столбцов

Ответ №2:

Пример 1

 // in post model
public function comments()
{
    return $this->hasMany('AppComment', 'post_id', 'id');
}

// in post controller
Post::with(['comments' => function($query) {
    $query->orderBy('date', 'desc');
}])->get();
  

Пример 2

 // in post model
public function comments()
{
    return $this->hasMany('AppComment', 'post_id', 'id')
        ->orderBy('date', 'desc');
}

// in post controller
Post::with('comments')->get();