Сортировать коллекцию по номерам, а затем по нулевым номерам, используя laravel

У меня есть коллекция, в которой мне нужно упорядочить по сумме (от самой низкой до самой высокой), и если у клиента нет общей суммы (-), оставьте ее ниже клиентов, которые делают.

Коллекция возвращает следующее:

введите описание изображения здесь

И я намерен добиться следующего результата (сначала клиентов с общим количеством, а затем клиентов, у которых нет общего количества):

введите описание изображения здесь

$sales = Sale::with('client')
->get()
->map(function($sale){
$sale['total'] = $sale->total ? $sale->total * $sale->quantity : '--';
return $sale;
});

Я пытался с помощью sortBy('total') но это не работает для меня.

Решение:

    $sales = Sale::with('client')
->get()
->map(function($sale){
$sale['total'] = $sale->total ? $sale->total * $sale->quantity : '--';
return $sale;
})
->sort(function($a, $b) {
if ($a->total == "--" && $b->total != "--") {
return 1;
}
if ($a->total != "--" && $b->total == "--") {
return -1;
}
if ($a->total == "--" && $b->total == "--") {
return 0;
}
return $a->total - $b->total;
});

Спасибо за помощь. С уважением

0

Решение

Вам просто нужно заказать asc на eagerload:

$sales = Sale::select('total', 'client_id')
->with(['client'=>function($query){
$query->orderBy('total', 'ASC');
}])
->get();

отредактирован:

$sales = Sale::select('total', 'client_id')
->with('client')
->orderBy('total', 'ASC')
->get();
0

Другие решения

Я думаю, что вам нужно использовать SQL «join», если вы хотите упорядочить отношения, так как with () будет загружать результат после (вы все равно можете использовать with (), если вам нужна загружаемая загрузка клиентов).

Используйте JOIN

Sale::select('total', 'client_id')->join( 'client', 'client.sale_id', '=', 'sale.id' )>orderBy( 'client.total', 'ASC' )->get();

Не уверен насчет иностранных имен и прочего, но вы поняли.

Используйте сортировку (в вашей коллекции)

$data->sortBy('client.total');

Вы должны предпочесть решение 1 (JOIN), так как второе решение требует обработки запросов к базе данных + сбора.

Изменить: вы можете сделать более сложный оператор соединения

Edit2: проверить этот стек

0