首页 > 解决方案 > 使用 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;
        });

谢谢您的帮助。问候

标签: phplaravelsortingcollect

解决方案


我认为如果你想通过关系订购,你需要使用 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:检查这个堆栈


推荐阅读