2016-09-14 50 views
0

编辑的净度:精炼我的口才查询(Laravel)

我需要一些方法为这个查询只查询的

->wherein('course_id', $array) 

一部分返回不同的course_ids。它可以获得已完成课程的总数,但如果用户已经完成课程的次数超过一次,则将其计入总数。所以如果你想知道有多少学生完成了一门课程,如果一个学生不止一次地完成了一门课程,这个数字将会被关闭。

public function report_count(){ 
    $array = \Session::get('course_report')['course']; 
    return $this->hasOne('Tracking', 'roster_id') 
     ->selectRaw('roster_id, count(*) as aggregate') 
     ->where('status', 1) 
     ->wherein('course_id', $array) 
     ->groupBy('roster_id'); 

我试过在最后加入groupBy('course_id')但它不起作用。

+0

这个统计信息可以在cronjob中生成吗? –

+0

这是一个内存问题吗?超时问题?您可以将查询分块,或通过cron预处理它们。您是否使用调试栏来查看您的查询是什么样的? – Blake

+0

首先是内存问题。我提高了记忆力,现在我相信它超时了。我们已经有很多cronjob了,但我可以与高级开发人员核对一下,看看他是否对这些预先运行有任何想法。我一直在使用debugbar,对花名册的查询很好,然后对每个关系吐出n + 1个查询。我试图加载查询,但它只是将每个已完成课程的值更改为0。 –

回答

0

固定。改变了查询

return $this->hasOne('Tracking', 'roster_id') 
     ->selectRaw('roster_id, count(distinct course_id) as aggregate') 
     ->where('status', 1) 
     ->wherein('course_id', $array) 
     ->groupBy('roster_id'); 

每@Robin [R建议下,我去了一个搜索的方式来利用SQL中我selectRaw查询,而不是这个困难的雄辩的语言。感谢所有帮助我集思广益的人。

+0

很高兴听到它帮助!将您自己的答案标记为已解决。 – Robin