使用 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】:
你有两个选择:
您可以通过添加select
和groupBy
来修正您的选项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 Eloquent - orWhereHas 方法 - 何时使用以及如何使用
如何对 Eloquent 关系中的数据透视表列进行 GROUP 和 SUM?