我遇到的问题是如何制定一个我无法访问的查询。在做像
这样的事情时$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的数量)显着减慢了事情。
答案 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();
答案 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();