FastAdmin后台控制器的列表函数,有时候需要同时使用where和having条件。
比如代码这么写的:
$list = $this->model
->alias('test')
->field("test.*,COUNT(1) AS total")
->group("test.name")
->where($where)
->having($having)
->order($sort, $order)
->paginate($limit);
运行时会报错,说having中用的total
字段不存在。
可以在报错的错误SQL中看到,代码执行时先是进行了一次count()
操作,而且字段只有count(*)
,把COUNT(1) AS total
直接省略了,所以报错。
解决办法自然是有的,步骤:
- 在排序和分页之前,先构造sql,即
$list = $this->model
->alias('test')
->field("test.*,COUNT(test.name) AS total")
->group("test.name")
->where($where)
->having($having)->buildSql();
- 手动查询记录总数,手动获取分页数据
$sql_total = "select count(*) as total from ({$sql}) as t";
$total = db()->query($sql_total)[0]['total'];
$sql = "select * from ({$sql}) as t order by {$sort} {$order} limit {$offset},{$limit}";
$list = db()->query($sql);
- 返回数据
$result = array("total" => $total, "rows" => $list);
return json($result);
这样就可以了。