【问题标题】:Refining My Eloquent Query (Laravel)完善我的雄辩查询(Laravel)
【发布时间】:2016-09-14 16:42:46
【问题描述】:

为清晰而编辑:

我需要一些方法让这个查询只返回不同的 course_ids

->wherein('course_id', $array)

查询的一部分。它获取已完成课程的总数,但如果用户多次完成课程,则将其计入总数。因此,如果您想知道有多少学生完成了一门课程,如果学生不止一次完成了一门课程,则该数字将关闭。

    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') 但它不起作用。

【问题讨论】:

  • 这个统计数据可以在 cronjob 中生成吗?
  • 这是内存问题吗?超时问题?您可以对查询进行分块,或通过 cron 对其进行预处理。您是否使用调试栏来查看您的查询是什么样的?
  • 一开始是内存问题。我增加了内存,现在我相信它超时了。我们已经有很多 cronjobs,但我可以咨询高级开发人员,看看他是否对预运行这些任务有任何想法。我一直在使用调试栏,花名册的查询很好,然后它为每个关系吐出 n+1 个查询。我尝试预先加载查询,但它只是将每个已完成课程的值更改为 0。
  • 这可能有帮助,也可能没有帮助,但是您是否在数据库上运行过类似的查询?您确定数据库已正确索引吗?是否有机会进一步索引数据库以帮助您的事业?例如,您是否使用过 mysql EXPLAIN 子句来查看查询使用的索引?如果存在数据库问题,则查询调整不太可能有帮助。最后你能分享一下数据库结构吗?
  • 是的,数据库运行良好,即使是大型查询。使用 jarek tkaczyk 的急切加载技术查看我对问题底部的编辑。我可以在不到半秒的时间内完成所有的比赛,唯一的问题是它没有给我正确的总数。我只需要知道在 where() 中运行什么样的子查询来获得正确的完成课程计数。

标签: php mysql laravel eloquent


【解决方案1】:

已修复。将查询更改为

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 的建议,我继续寻找在我的 selectRaw 查询中使用 SQL 的方法,而不是尝试这种雄辩的方式。感谢所有帮助我集思广益的人。

【讨论】:

  • 很高兴听到它有帮助!将您自己的答案标记为已解决。
猜你喜欢
  • 2018-01-26
  • 2021-07-23
  • 2021-11-09
  • 2017-11-11
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多