Laravel: красноречивый столбец отношения orderBy hasOne, использующий с - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть модель Orders с отношением hasOne participant.

public function participant()
{
    return $this->hasOne('App\OrderParticipant', 'order_id');
}

Мне нужно получить коллекцию Orders, отсортированную по participant.last_name

Myподхода

$orders = \App\Orders::with(['participant',])
              ->where('user_id', $user->id)  
              ->orderBy('participant.last_name')
              ->get();

Сбой:

Неопределенная таблица: 7 ОШИБКА: отсутствует запись предложения FROM для таблицы \ "участник \" \ nLINE 1: ... 1

Я пытался отсортировать его после сбора

return $orders->sortBy('participant.last_name');

Но это совсем не сортируется

Кстати, я использую postgres

Спасибо.

Ответы [ 3 ]

4 голосов
/ 25 апреля 2019

Вы не можете заказать напрямую через hasOne, вам нужно использовать join

$orders = \App\Orders::with([
                'participant',                    
                ])
            ->where('orders.user_id', $user->id)  
            ->join('participants', 'orders.user_id', '=', 'participants.id')
            ->orderBy('participants.last_name')
            ->select('orders.*','participants.id','participants.last_name')
            ->get();


1 голос
/ 25 апреля 2019

Вы можете достичь этого с помощью

  //  eager loading
  $orders = \App\Orders::with(['participant'=> function($q){
             $q->orderBy('last_name', 'asc/desc');
            }
           ])->get();
0 голосов
/ 25 апреля 2019

Это выглядит немного избыточно, но я разобрался с помощью join. Довольно уродливый, хотя. Обратите внимание на select часть. Без этого все запутано

          $orders = \App\Orders::select('orders.*')
                ->with([
                    '....',
                    'participant',
                    'participant.documents',
                    'participant.participantParent',
                    'participant.country',
                    '...'
                    ])
                ->join('order_participants', function ($join) {
                    $join->on('order_participants.order_id', '=', 'orders.id');
                })
                ->where('orders.user_id', $user->id)  
                ->where(function($q) {
                    $q->where('orders.status', '!=', 'completed')
                    ->orWhereNull('orders.status');
                })   
                ->orderBy('order_participants.last_name')
                ->orderBy('order_participants.first_name')
                ->get();

Поскольку мой запрос немного сложнее, чем в предыдущем вопросе, я публикую весь код в качестве примера. Как я понимаю, join должно предшествовать where заявлениям

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...