使用 sum 与关系 Laravel Eloquent ORM

Posted

技术标签:

【中文标题】使用 sum 与关系 Laravel Eloquent ORM【英文标题】:using sum with relation Laravel Eloquent ORM 【发布时间】:2020-03-25 11:32:30 【问题描述】:

我有模型材料,它有

 protected $with = ['costPrices'];

public function costPrices()
    return $this->hasMany(CostPrice::class);

cost_prices 表有多个数量

 //create_cost_prices_table
   Schema::create('cost_prices', function (Blueprint $table) 
        $table->bigIncrements('id');
        $table->unsignedBigInteger('material_id');
        $table->unsignedBigInteger('supplier_id');
        $table->integer('quantity');
        $table->timestamps();
    );

我想以另一种方式获取(材料不足)选择所有材料表格材料表,其中所有成本价格表的数量总和

【问题讨论】:

看看whereHas:laravel.com/docs/6.x/… 当我使用$materials = Material::whereHas('costPrices', function($q) $q->havingRaw('SUM(quantity) > 4'); )->get(); 时出现错误SQLSTATE[42000]: Syntax error or access violation: 1140 In aggregated query without GROUP BY, expression 【参考方案1】:

你有两个选择:

您可以通过添加selectgroupBy 来修正您的选项whereHas()

$materials = Material
    ::whereHas('costPrices', function($q)  
        $q
            ->select('meterial_id')
            ->groupBy('material_id')
            ->havingRaw('SUM(quantity) > 4'); 
    )
    ->get();

或者使用子查询:

对于 laravel 6.x:

$materials = Material
    ::addSelect([
        'cost_prices_sum' => CostPrice::selectRaw('sum(quantity)')->whereColumn('material_id', 'material.id')
    ])
    ->having('cost_prices_sum', '>', 4)
    ->get();

对于 laravel 5.x:

$materials = Material
    ::selectRaw('carts.*, (select sum(quantity) from cost_prices where cost_prices.matrerial_id = meterials.id) as cost_prices_sum')
    ->having('cost_prices_sum', '>', 4)
    ->get();

更新: 选项与whereHas() 在大量行上更快。

【讨论】:

以上是关于使用 sum 与关系 Laravel Eloquent ORM的主要内容,如果未能解决你的问题,请参考以下文章

Laravel SUM 一对多(逆)/属于关系

Laravel Blade Sum 函数不计算负数

Laravel Eloquent - orWhereHas 方法 - 何时使用以及如何使用

如何对 Eloquent 关系中的数据透视表列进行 GROUP 和 SUM?

如何使用数据库将数据从一个表导入另一个表:播种? (laravel 5.3)?

Laravel使用Sum和Groupby