【问题标题】:Customize Laravel paginate count query自定义 Laravel 分页计数查询
【发布时间】:2017-09-21 20:58:24
【问题描述】:

我有一个这样的 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'

是否可以让 count 查询不在这里做不必要的 JOIN?

【问题讨论】:

    标签: mysql laravel pagination


    【解决方案1】:

    您需要了解分页的工作原理。由于您的查询需要加入其他表,并添加了复杂的选择(例如:在 select 参数上包含类似月份的函数)。查询本身必须加入子查询(如上所述)..

    这个问题的正确答案是将上面的查询变成视图表。并将视图视为模型上的表格。当你运行时,你输入的代码比现在的代码少。使用此视图,您将在开发过程中减少错误/警告。

    正如我之前提到的使用视图,您不能只创建 1 个视图。从此查询创建视图

    SELECT count(c.id) FROM bookstack.comments c WHERE c.parent_id = comments.id AND page_id = '2'
    

    然后在 user_comment(视图)上使用它。这不是一个简单的答案,但是这种方法可以让你的代码可读。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-21
      • 1970-01-01
      相关资源
      最近更新 更多