3 回答
TA贡献1817条经验 获得超6个赞
查询应该是:
$posts = Post::selectRaw('posts.*, count(post_views.id) as views_count')
->join('post_views', function($join) {
$join->on('posts.id', '=', 'post_views.post_id')
->where('post_views.created_at', '>=', 'DATE_ADD(CURDATE(), INTERVAL -30 DAY)');
})
->groupBy('posts.id')
->orderBy('views_count', 'DESC')
// ->take(10) // no need of this
//->get(); // will be using paginate
->paginate(10);
TA贡献1811条经验 获得超6个赞
你有没有尝试过
PostViews::where('created_at', '>=', 'DATE_ADD(CURDATE(), INTERVAL -30 DAY)')->groupBy('post_id')->selectRaw('count(*) as post_count')->with('post')->paginate(10);假设你有一个索引 created_at
TA贡献1876条经验 获得超6个赞
我已经弄清楚了 - join->where 子句被转义并使查询无效。不是无效的sql,只是一个无效的比较,这样总是没有结果。
当然,查询记录器并没有显示它被转义了,所以将查询复制到 mysql 中是可行的,这使得追踪起来比原本应该的要困难得多。
这有效:
$posts = Post::select('posts.*', DB::raw('count(post_views.id) as views_count'))
->join('post_views', function($join) {
$join->on('posts.id', '=', 'post_views.post_id')
->where('post_views.created_at', '>=', DB::raw('DATE_ADD(CURDATE(), INTERVAL -30 DAY)'));
})
->groupBy('posts.id')
->orderBy('views_count', 'DESC')
重要的是:DB::raw('DATE_ADD(CURDATE(), INTERVAL -30 DAY)')
- 3 回答
- 0 关注
- 210 浏览
添加回答
举报
