laravel中DB::select()如何进行分页?
简单的查询和分页代码如下:
public function manage(Request $request)
{
$data = [];
$rows = $request->input('rows', 10);
$query = Followup::query()
->orderBy('created_at', 'desc')
->paginate($rows);
if ($query) {
$data['rows'] = $query->items();
$data['total'] = $query->total();
} else {
$data['rows'] = [];
$data['total'] = 0;
}
}
return $this->success($data);
现在有个复杂的报表查询语句:
select a.d as date,a.user_id as user_id,ifnull(a.bb,0) as 计划回访数量,ifnull(b.bb,0) as 完成回访数量,
ifnull(c.bb,0) as 创建回访数量 from
(
select date as d,followup_user as user_id,count(followup_user) as bb from cy_followup
where date>='2021-03-10' and date<='2021-03-10' group by date,followup_user
) a left join
(
select date_format(time,'%Y-%m-%d') as d,EXECUTE_user as user_id,count(EXECUTE_user) as bb from cy_followup
where time>='2021-03-10' and time<'2021-03-10' group by date_format(time,'%Y-%m-%d'),EXECUTE_user
) b on a.d=b.d and a.user_id=b.user_id left join
(
select date_format(created_at,'%Y-%m-%d') as d,user_id,count(user_id) as bb from cy_followup
where created_at >='2021-03-10' and created_at <'2021-03-10' group by date_format(created_at,'%Y-%m-%d'),user_id
) c on a.d=c.d and a.user_id=c.user_id
union
select c.d,c.user_id,ifnull(a.bb,0) as 计划回访数量,ifnull(b.bb,0) as 完成回访数量,ifnull(c.bb,0) as 创建回访数量 from
(
select date as d,followup_user as user_id,count(followup_user) as bb from cy_followup
where date>='2021-03-10' and date<='2021-03-10' group by date,followup_user
) a right join
(
select date_format(time,'%Y-%m-%d') as d,EXECUTE_user as user_id,count(EXECUTE_user) as bb from cy_followup
where time>='2021-03-10' and time<'2021-03-10' group by date_format(time,'%Y-%m-%d'),EXECUTE_user
) b on a.d=b.d and a.user_id=b.user_id right join
(
select date_format(created_at,'%Y-%m-%d') as d,user_id,count(user_id) as bb from cy_followup
where created_at >='2021-03-10' and created_at <'2021-03-10' group by date_format(created_at,'%Y-%m-%d'),user_id
) c on a.d=c.d and a.user_id=c.user_id
这个在laravel中貌似只能用DB::select($sql)
来执行了?但是如何分页?
最后用mysql中的view来解决这个问题
CREATE VIEW cy_v_followup_statistic
AS
SELECT *
FROM (
SELECT a.d AS date, a.user_id AS user_id, ifnull(a.bb, 0) AS followup_count
, ifnull(b.bb, 0) AS execute_count
, ifnull(c.bb, 0) AS create_count
FROM (
SELECT date AS d, followup_user AS user_id, COUNT(followup_user) AS bb
FROM cy_followup
GROUP BY date, followup_user
) a
LEFT JOIN (
SELECT date_format(created_at, '%Y-%m-%d') AS d, user_id
, COUNT(user_id) AS bb
FROM cy_followup
GROUP BY date_format(created_at, '%Y-%m-%d'), user_id
) c
ON a.d = c.d
AND a.user_id = c.user_id
LEFT JOIN (
SELECT date_format(time, '%Y-%m-%d') AS d, EXECUTE_user AS user_id
, COUNT(EXECUTE_user) AS bb
FROM cy_followup
GROUP BY date_format(time, '%Y-%m-%d'), EXECUTE_user
) b
ON a.d = b.d
AND a.user_id = b.user_id
) t
我有个大胆的想法,把这条语句定义为一个视图,然后使用laravel模型绑定这个视图,再做分页是不是代码量会少一点?