雄辩计数不同返回错误的总数

时间:2014-05-15 22:16:26

标签: mysql laravel-4 eloquent

我遇到的问题是如何制定一个我无法访问的查询。在做像

这样的事情时
$model->where('something')
->distinct()
->paginate();

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

select count(*) as aggregate from .....

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

的内容
select count(distinct id) as aggregate from .....

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

有没有办法欺骗它在计数查询中添加distinct?

P.S深入挖掘构建器代码,我们发现IF语句要求count()方法上的字段,以便将不同的属性添加到计数中。照亮\数据库\查询\文法\ BaseGrammar @ compileAggregate

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

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

3 个答案:

答案 0 :(得分: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();

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

答案 1 :(得分:0)

我遇到了同样的问题并找到了两个解决方案:

糟糕的一个:

$results = $model->groupBy('foo.id')->paginate();

它有效,但是如果你有很多行(这是我的情况)会花费太多的内存(和时间)。

更好的一个:

$ids = $model->distinct()->pluck('foo.id');
$results =  $query = $model->whereIn('foo.id', $ids)->paginate();

我尝试了100k结果,并没有任何问题。

答案 2 :(得分:-1)

$model->where('something')->distinct()->count('id')->paginate();