Laravel Eloquent Сортировка по столбцу отношений

У меня есть несколько отношений, одно из которых я хотел бы использовать для упорядочивания списка, но я не могу найти правильный способ сделать это.

Ниже представлены мои отношения:

public function date(){
    return $this->hasOne(agent_billings_dates::class,'id','dateID');
}

public function carrier(){
    return $this->hasOne(customer::class,'id','carrierID');
}

А также два атрибута, которые я добавил в качестве дополнений:

public function getItemCountAttribute(){
    return $this->items->count();
}

public function getItemMissingAttribute(){
    return $this->itemIssues->count();
}

public function getBatchSumAttribute(){
    return $this->items->sum('amount');

Все они хорошо проявляются, когда в моей функции есть следующее:

$batches = agent_billings_batches::with(['date','carrier','carrier.carrierDetails'])
        ->where('status',$request->status)
        ->get();

Но атрибуты и with отваливаются, когда я это делаю (однако дата отсортирована соответствующим образом):

$batches = agent_billings_batches::with(['carrier','carrier.carrierDetails'])
        ->join('agent_billings_dates', 'agent_billings_dates.id', '=', 'agent_billings_batches.dateID')
        ->orderBy('agent_billings_dates.date','desc')
        ->where('status',$request->status)
        ->get();

Я делаю что-то неправильно? Буду признателен за любую помощь, которую может дать кто-нибудь.

Спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
0
3 673
1

Ответы 1

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

$batches = agent_billings_batches::with(['date','carrier','carrier.carrierDetails'])
    ->where('status',$request->status)
    ->get()
    ->sortBy(function ($batch) { 
         return $batch->date->date; 
    }); 

это решение нецелесообразно, если вы разбиваете свой результат на страницы в таком порядке

N69S 24.10.2018 18:28

@ N69S да, у него есть 2 основных недостатка, если вам нужно разбивать на страницы: (1) вам нужно загрузить весь результат и (2) вам нужно вручную создать экземпляр LengthAwarePaginator (или простой). Однако либо это, либо использование объединений имеет свои недостатки.

apokryfos 24.10.2018 18:31

@apokryfos - Для меня разбивка на страницы не является проблемой в данный момент (так как на максимальном уровне он должен возвращать только около 20/30 результатов. Но я сделал то, что вы сказали выше, и он по-прежнему выводит результаты, но не в любом порядке, Я также попробовал sortByDesc, и ничего не изменилось. Были ли у вас другие предложения?

inuShiva 24.10.2018 19:09

Другие вопросы по теме