Сортировка по табличным отношениям в laravel - PullRequest
1 голос
/ 27 июня 2019

У меня есть проект Laravel, в котором есть модели User и Order. Пользовательская модель имеет отношение к сортировке модели заказа следующим образом:

public function last_order() {
   return $this->hasOne('Order', 'user_id')->orderBy('created_at', 'desc')->limit(1);
}

Возвращает последний заказ для определенного пользователя. Работает нормально.

Мне нужно также вернуть отсортированный массив пользователей из нового порядка. Я попытался сделать это с Eloquent на уровне хранилища, например:

User::has('last_order')->with('last_order')->orderBy('last_order.created_at', 'desc')->get();

Это не работает. Я также попробовал это с методом sortBy, тот же результат. Это возвращает меня, что таблица last_order не существует.

Не могли бы вы посоветовать мне, как легко отсортировать подобные вещи с помощью Eloquent (не на уровне службы и без необработанного выбора)?

Спасибо.

Ответы [ 2 ]

1 голос
/ 27 июня 2019

sortBy() с использованием точечной нотации прекрасно работает после вас get() коллекции.

User::has('last_order')->with('last_order')->get()->sortByDesc('last_order.created_at');

Я также заметил, что отношение last_order() уже отсортировано. Это не будет работать, если вы не создадите другое отношение, которое не ограничивает возврат до 1 и не предварительно отсортировано.

0 голосов
/ 27 июня 2019

Мне приходит в голову:

public function scopeLasorder($query)
{
    return $query->join(
        with(new Orden())->getTable(), 'user_id', '=', 'id' //id de User
    )->whereNotNull('last_order');
}

И выполнить

User->lastorder->orderBy(new Orden())->getTable().'.created_at', 'desc')
...