Model::count()在查询范围中返回错误


Model::count() returns error in Query scope

我使用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();