Laravel雄辩错误在尝试使用sum时期望参数1为string



我使用了这个查询:

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

但是结果是一样的

在你不得不面对大集合之前不要担心它

最新更新