Php 使用laravel按数字排序集合,然后按空数字排序集合

Php 使用laravel按数字排序集合,然后按空数字排序集合,php,laravel,sorting,collect,Php,Laravel,Sorting,Collect,我有一个集合,我需要按总计(从最低到最高)排序,如果客户没有总计(-),请将其保留在有总计的客户下方 集合返回以下内容: 我的目的是实现下一个结果(首先是有总计的客户,然后是没有总计的客户): 我尝试使用sortBy('total'),但它对我不起作用 解决方案: $sales = Sale::with('client') ->get() ->map(function($sale){ $sale['total

我有一个集合,我需要按总计(从最低到最高)排序,如果客户没有总计(-),请将其保留在有总计的客户下方

集合返回以下内容:

我的目的是实现下一个结果(首先是有总计的客户,然后是没有总计的客户):

我尝试使用
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订购即可:

$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())

使用连接

Sale::select('total', 'client_id')->join( 'client', 'client.sale_id', '=', 'sale.id' )>orderBy( 'client.total', 'ASC' )->get();
不确定外国的名字和东西,但你知道了

使用排序(在您的收藏中)

您应该更喜欢解决方案1(JOIN),因为第二个解决方案需要数据库查询+集合处理

编辑:您可以执行更复杂的join语句


Edit2:选中orderByRaw('-total DESC')尝试此选项我在集合中使用“map”创建的“total”字段,因此我无法使用orderBy。谢谢。您能告诉我们您的表(哪些字段)
sales
和表
clients
的样子吗?字段“total”属于“sales”表,而不是“clients”。ThanksIt无助于应用“orderB”y,因为“total”字段是在集合中使用“map”获得的。我必须使用“sortBy”或“sort”将订单标准应用于集合。Thanks@CristianMeza然后使用map添加整个查询和修改。嵌套的orderBy将仅由每次销售的客户orderBy。不是销售人员本身。@Leorent编辑我的回答我不能使用join,因为我在集合中使用“map”得到“total”字段。我必须将订单if或if应用于收款。谢谢。啊,是的,我明白了。因此,在映射之后,需要对集合进行排序。
Sale::select('total', 'client_id')->join( 'client', 'client.sale_id', '=', 'sale.id' )>orderBy( 'client.total', 'ASC' )->get();
$data->sortBy('client.total');