Eloquent count distinct 返回错误的总数

mbo*_*las 6 mysql eloquent laravel-4

我对如何雄辩地制定我无法访问的查询有疑问。当做类似的事情时

$model->where('something')
->distinct()
->paginate();
Run Code Online (Sandbox Code Playgroud)

eloquent 运行查询以获取总数,查询看起来像

select count(*) as aggregate from .....
Run Code Online (Sandbox Code Playgroud)

问题是,如果您在查询中使用 distinct ,您需要类似

select count(distinct id) as aggregate from .....
Run Code Online (Sandbox Code Playgroud)

以获得正确的总数。Eloquent 并没有这样做,因此返回了错误的总数。获得不同计数的唯一方法是通过查询构建器传递一个参数,如 ->count('id') 在这种情况下它将添加它。问题是这个查询是自动生成的,我无法控制它。

有没有办法欺骗它在计数查询上添加不同的?

PS 深入挖掘构建器代码,我们发现一个 IF 语句要求 count() 方法上的一个字段,以便将不同的属性添加到计数中。Illuminate\Database\Query\Grammars\BaseGrammar@compileAggregate

if ($query->distinct && $column !== '*')
{
   $column = 'distinct '.$column;
}
return 'select '.$aggregate['function'].'('.$column.') as     aggregate';
Run Code Online (Sandbox Code Playgroud)

PS1 我知道在 SQL 中你可以做一个分组,但是由于我急于加载东西,这不是一个好主意,因为它会向其他每个查询添加一个 IN(找到的 id 数量),这会显着减慢速度.

Gad*_*oma 0

这似乎是一个更广泛的问题,在这里讨论:

https://github.com/laravel/framework/issues/3191
https://github.com/laravel/framework/pull/4088

在 Laravel 的下一个版本发布修复之前,您始终可以尝试使用原始表达式,如下所示(我没有测试它,但应该可以)

$stuff = $model->select(DB::raw('distinct id as did'))
  ->where('whatever','=','whateverelse')
  ->paginate();
Run Code Online (Sandbox Code Playgroud)

参考: http: //laravel.com/docs/queries#raw-expressions