自定义Laravel分页计数查询

时间:2017-04-25 02:31:54

标签: mysql laravel pagination

我是一个Laravel分页查询 -

$query = static::newQuery();
$query->join('users AS u', 'comments.created_by', '=', 'u.id');
$query->leftJoin('users AS u1', 'comments.updated_by', '=', 'u1.id');
$query->leftJoin('images AS i', 'i.id', '=', 'u.image_id');
$query->selectRaw('comments.id, text, html, comments.created_by, comments.updated_by, comments.created_at, comments.updated_at, '
        . 'u.name AS created_by_name, u1.name AS updated_by_name, '
        . '(SELECT count(c.id) FROM bookstack.comments c WHERE c.parent_id = comments.id AND page_id = ?) AS cnt_sub_comments, i.url AS avatar ', 
        [$pageId]);

if (empty($commentId)) {
    $query->whereRaw('page_id = ? AND parent_id IS NULL', [$pageId]);
} else {
    $query->whereRaw('page_id = ? AND parent_id = ?', [$pageId, $commentId]);
}        
$query->orderBy('created_at');
return $query;

然后我在查询对象上运行分页。

$query->paginate($count); 

这会导致运行以下查询 -

select comments.id, text, html, comments.created_by, comments.updated_by, comments.created_at, comments.updated_at, u.name AS created_by_name, 
u1.name AS updated_by_name, (SELECT count(c.id) FROM bookstack.comments c WHERE c.parent_id = comments.id AND page_id = '2') AS cnt_sub_comments, 
i.url AS avatar  from `comments` inner join `users` as `u` on `comments`.`created_by` = `u`.`id` 
left join `users` as `u1` on `comments`.`updated_by` = `u1`.`id` 
left join `images` as `i` on `i`.`id` = `u`.`image_id` 
where page_id = '2' AND parent_id = '2' order by `created_at` asc limit 20 offset 0

此外,还会运行以下计数查询,

select count(*) as aggregate from `comments` inner join `users` as `u` on `comments`.`created_by` = `u`.`id` 
left join `users` as `u1` on `comments`.`updated_by` = `u1`.`id` 
left join `images` as `i` on `i`.`id` = `u`.`image_id` 
where page_id = '2' AND parent_id = '2'

是否可以让计数查询不在这里进行不必要的JOIN?

0 个答案:

没有答案