FastAdmin后台列表同时使用where和having的问题

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直接省略了,所以报错。

解决办法自然是有的,步骤:

  1. 在排序和分页之前,先构造sql,即
$list = $this->model
        ->alias('test')
        ->field("test.*,COUNT(test.name) AS total")
        ->group("test.name")
        ->where($where)
        ->having($having)->buildSql();
  1. 手动查询记录总数,手动获取分页数据
$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);
  1. 返回数据
$result = array("total" => $total, "rows" => $list);

return json($result);

这样就可以了。

Leave a Comment

豫ICP备19001387号-1