У меня есть коллекция, в которой мне нужно упорядочить по сумме (от самой низкой до самой высокой), и если у клиента нет общей суммы (-), оставьте ее ниже клиентов, которые делают.
Коллекция возвращает следующее:
И я намерен добиться следующего результата (сначала клиентов с общим количеством, а затем клиентов, у которых нет общего количества):
$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;
});
Спасибо за помощь. С уважением
Вам просто нужно заказать 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();
Я думаю, что вам нужно использовать 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: проверить этот стек