【发布时间】:2014-07-04 13:42:53
【问题描述】:
我对 eloquent 如何制定我无法访问的查询有疑问。当做类似的事情时
$model->where('something')
->distinct()
->paginate();
eloquent 运行一个查询来获取总数,查询看起来像
select count(*) as aggregate from .....
问题是,如果你在查询中使用 distinct,你想要类似
select count(distinct id) as aggregate from .....
得到正确的总数。但 Eloquent 并没有这样做,因此返回了错误的总数。获得不同计数的唯一方法是通过查询构建器传递一个参数,例如 ->count('id') 在这种情况下它将添加它。问题是这个查询是自动生成的,我无法控制它。
有没有办法欺骗它在计数查询中添加不同的?
P.S 深入挖掘构建器代码,我们发现一个 IF 语句要求在 count() 方法上提供一个字段,以便将 distinct 属性添加到计数中。 Illuminate\Database\Query\Grammars\BaseGrammar@compileAggregate
if ($query->distinct && $column !== '*')
{
$column = 'distinct '.$column;
}
return 'select '.$aggregate['function'].'('.$column.') as aggregate';
PS1 我知道在 SQL 中你可以进行分组,但由于我急于加载东西,所以这不是一个好主意,因为它会在每个其他查询中添加一个 IN(找到的 id 数)显着减慢速度。
【问题讨论】:
-
顺便说一句,你用的是什么版本的 Laravel?