【问题标题】:Sort collection by numbers and then by null numbers using laravel使用 laravel 按数字排序集合,然后按空数字排序
【发布时间】:2018-08-27 20:26:38
【问题描述】:

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

该集合返回以下内容:

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

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

感谢您的帮助。问候

【问题讨论】:

  • orderByRaw('-total DESC') 试试这个
  • 我在集合中使用“map”创建的“total”字段,因此我不能使用 orderBy。谢谢。
  • 你能告诉我们你的表(哪些字段)sales 和表clients 的样子吗?

标签: php laravel sorting collect


【解决方案1】:

您只需要在 eagerload 上按 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();

【讨论】:

  • 字段“total”属于“Sales”表,而不是“Clients”。谢谢
  • 应用“orderB”y 没有帮助,因为“total”字段是使用“map”在集合中获得的。我必须使用“sortBy”或“sort”将排序标准应用于集合。谢谢
  • @CristianMeza 然后用地图添加整个查询和修改。
  • 嵌套 orderBy 将仅 orderBy 每个销售的客户。不是销售本身。
  • @Leorent 编辑我的答案
【解决方案2】:

我认为如果你想通过关系排序,你需要使用 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:检查this stack

【讨论】:

  • 我不能使用join,因为我使用“map”在集合中获得了“total”字段。我必须将订单应用到集合中。谢谢。
  • 啊,是的,我明白了。确实如此,您需要在映射后对集合进行排序。
猜你喜欢
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
相关资源
最近更新 更多