我使用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();
}
有人能解释为什么会这样吗?
表中没有行。
出现此错误的原因是Eloquent生成器中处理作用域的方式。如果您查看了Builder的代码,您可以看到以下方法:
protected function callScope($scope, $parameters)
{
array_unshift($parameters, $this);
return call_user_func_array([$this->model, $scope], $parameters) ?: $this;
}
如您所见,如果scope方法返回truthy值(强制转换为布尔值时计算结果为true的值),则该值是调用scope的结果。另一方面,如果返回的值计算为false,则返回构建器对象。在您的情况下,由于表中没有行,所以scope的返回值为0,这就是为什么您得到的构建器对象是Model::countUsers()
的结果。
如果不能保证作用域总是返回一个truthy值,那么从作用域方法返回任何内容都不是一个好主意。我的建议是只使用作用域来定义常见的约束集,正如文档所建议的那样,这些约束集可以在整个应用程序中轻松重用,而不是执行查询。一些例子:
Model::someScope()->get();
Model::someScope()->someOtherScope()->count();