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

时间:2015-11-29 12:17:01

标签: php laravel laravel-4 eloquent

我正在使用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 个答案:

答案 0 :(得分:1)

您收到此错误的原因是在Eloquent构建器中处理范围的方式。如果您查看Builder的代码,可以看到以下方法:

protected function callScope($scope, $parameters)
{
    array_unshift($parameters, $this);
    return call_user_func_array([$this->model, $scope], $parameters) ?: $this;
}

如您所见,如果scope方法返回 truthy值(在转换为boolean时计算结果为true的值),则此值是调用范围的结果。另一方面,如果返回值的计算结果为false,则返回构建器对象。在您的情况下,由于表中没有行,因此范围的返回值为0,这就是您在Model::countUsers()后获取构建器对象的原因。

如果您无法保证范围始终返回真值,那么从范围方法返回任何内容都不是一个好主意。我的建议是仅使用范围来定义您可以在整个应用程序中轻松重用的常见约束集,正如文档所示,不执行查询。一些例子:

Model::someScope()->get();
Model::someScope()->someOtherScope()->count();