【问题标题】:several aggregation on laravel eloquentlaravel eloquent 上的几个聚合
【发布时间】:2022-01-10 13:45:32
【问题描述】:

我有 4 个模型:物质、效果、部分、属性。 每个 Matter 都有几个 Part,每个 Part 都有几个效果和属性。 每个效果也有几个属性。

我想要 Laravel eloquent 的这个结果:

property_title |效果数 (effect_property) |效果数 (part_property) |财产的影响

所有这些值都应该在有限的情况下 ids 已经给出并且包括在任何效果和任何部分中的属性(意思不包括仅在部分中的属性)事项或仅在效果上的事项)

我进行了此查询,但处理大量数据的时间太长:

 $result = Property::matterin($where)
            ->leftJoin('part_property', 'part_property.property_id', '=', 'properties.id')
            ->leftJoin('parts', 'parts.id', 'part_property.part_id')
            ->select(['parts.*','parts.matter_id','properties.id as id',  'properties.title as title',
                DB::raw('sum(if(part_property.part_id is not null,1,0 )) as count_partmatter'),
            ])
            ->whereNotNull(['properties.id'])
            ->groupBy(['properties.id'])
            ->get();

            foreach($result as $key => $prop) {
                if($prop->effects->isNotEmpty()){
                    $prop->effects()
                        ->leftJoin('effect_part','effect_part.effect_id','effects.id')
                        ->leftJoin('parts','parts.id','effect_part.part_id')
                        ->whereIn('parts.matter_id',$where);
                }else{
                    $result->forget($key);
                }
            }

但最后一列存在每个属性对所有事务的所有影响,而不仅仅是具有特定 $where 事务 ID 的那些。

【问题讨论】:

    标签: mysql laravel database eloquent


    【解决方案1】:

    我认为您需要考虑使用“withCount”功能。 抽象例子

    /** partProperty is any your relation*/
     $result = Property::withCount(['partProperty as count_partmatter' => function($q) {
    
          $q->select(DB::raw('sum(if(part_property.part_id is not null,1,0 )))
    }])
    

    基于此示例,在同一查询中构建链的其余部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-07
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 2014-05-30
      • 2021-11-04
      相关资源
      最近更新 更多