我使用了这个查询:
Product::whereId($item->id)->sum(function ($row) {
return $row->quantity * ($row->variable ?? 1);
});
但是我得到了这个错误:
生产。错误:stripos()期望参数1是字符串,对象给定
我想把$row->quantity * $row->variable
的结果作为和,但是$row->variable
的一些结果是空的,所以我用($row->variable ?? 1)
。
我建议通过做一些条件聚合,直接在数据库层执行这样的求和操作
Product::whereId($item->id)
->sum(DB::raw('quantity * (case when variable > 0 then variable else 1 end)'));
上述方法有两个主要优点
- 保持你的逻辑/代码,因为它应该是简单的,所以没有必要在内存(代码库)中获取所有的行,无论你的数据集给定的条件是小或大,当你可以直接从数据库服务器获取它,这是一个非常常见的操作数据库处理。
- 使用collection helper方法时不需要额外的循环和计算
是的,它抛出异常,因为你必须使用string而不是function(closure)
使用
Product::selectRaw("sum(quantity * variable)")->whereId($item->id)->get();
我用get()
先集合后求和,我的问题解决了。
所以我把代码改成了:
Product::whereId($item->id)->get()->sum(function ($row) {
return $row->quantity * ($row->variable ?? 1);
});
如果集合比较小就运行sum函数
但是如果你有一个巨大的集合,例如你有2000个项目,那么在mysql中计算总和将是一个不错的选择
在你的代码中,你首先从DB得到结果,然后在php中运行集合的总和操作,而不是在mysql
但是结果是一样的
在你不得不面对大集合之前不要担心它