Model::count() 在查询范围内返回错误
Posted
技术标签:
【中文标题】Model::count() 在查询范围内返回错误【英文标题】:Model::count() returns error in Query scope 【发布时间】:2016-03-03 03:32:39 【问题描述】:我正在使用count()
方法来计算模型中的行数。如果我像这样直接使用它,它会起作用:
return Model::count();
但是当我尝试在 Query 范围内使用它时,我收到了一个错误:
Object of class Illuminate\Database\Eloquent\Builder could not be converted to string
模型中的查询范围:
public function scopecountUsers($query)
return $query->count();
谁能解释为什么会这样?
表格中没有行。
【问题讨论】:
【参考方案1】:您收到此错误的原因是 Eloquent 构建器中处理范围的方式。如果你看一下 Builder 的代码,你可以看到如下方法:
protected function callScope($scope, $parameters)
array_unshift($parameters, $this);
return call_user_func_array([$this->model, $scope], $parameters) ?: $this;
如您所见,如果作用域方法返回一个真实值(当转换为布尔值时计算结果为真的值),那么这个值就是调用作用域的结果。另一方面,如果返回值为 false,则返回 builder 对象。在您的情况下,由于表中没有行,因此范围的返回值为 0,这就是为什么您会通过 Model::countUsers()
获取构建器对象。
如果你不能保证作用域总是返回一个真值,那么从作用域方法返回任何东西都不是一个好主意。我的建议是仅使用范围来定义常见的约束集,您可以在整个应用程序中轻松地重用它们,正如文档所建议的那样,而不是执行查询。一些例子:
Model::someScope()->get();
Model::someScope()->someOtherScope()->count();
【讨论】:
以上是关于Model::count() 在查询范围内返回错误的主要内容,如果未能解决你的问题,请参考以下文章
子查询返回超过 1 个值 - 使用特定日期的值更新日期范围内的记录