Сортировать коллекцию по номерам, а затем по нулевым номерам, используя laravel - PullRequest
0 голосов
/ 27 августа 2018

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

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

enter image description here

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

enter image description here

$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;
        });

Спасибо за помощь. Привет

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Я думаю, что вам нужно использовать 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 голосов
/ 27 августа 2018

Вам просто нужно сделать заказ по 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();
...