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() 在查询范围内返回错误的主要内容,如果未能解决你的问题,请参考以下文章

在特定日期范围内接收 ORA-01427

SQL查询返回超出范围内允许数量的记录

查询返回日期范围内的行,但只返回列的最大值

子查询返回超过 1 个值 - 使用特定日期的值更新日期范围内的记录

Laravel Eloquent - 如何将范围查询内的计算值作为模型列或集合属性返回

从 Prometheus 查询中的返回值生成范围向量