最近遇到一个需要,laravel admin的列表外面须要做统计查问

$grid = new Grid(new Attendancer());$grid->model()->selectRaw('cur_room,count(*) as aggregate')->whereRaw('cur_room is not null && cur_room !=""')->groupBy("cur_room");$grid->column('cur_room','房间号');$grid->column('aggregate','人数');return $grid;

以上代码执行之后成果如图

而后接下来须要对这两列做数据过滤

  $grid->filter(function (Grid\Filter $filter){            $filter->setFilterID("count");            $filter->disableIdFilter();            $filter->where(function ($query){                $query->having("aggregate",">=",$this->input);            },'人数');            $filter->equal('cur_room','房间号');        });

执行之后会发现,having那一行没用。文档外面filter也没有提到应用having的内容。那就只能本人来。

filter底层有一个办法是getColumn,能够返回该输出项的name。而后通过$_GET来获取传进来的参数。
此处有个事项须要留神,就是对于count(*)的名字问题,必须要用 aggregate 否则会提醒查问sql时列名不存在,因为laravel-admin在执行这个办法的时候会带上开发者本人定义的where条件和聚合条件做一次统计查问

select count(*) as aggregate from `attendancer` where 你的查问条件 group by `聚合字段` having 你的字段名 >= 2

不改成count字段的名字不改成aggregate的话会在查问的时候提醒 Column not found: 1054 Unknown column '你的字段名' in 'having clause'

残缺代码如下

        $grid = new Grid(new Attendancer());        $c='';        $grid->filter(function (Grid\Filter $filter)use(&$c){            $filter->setFilterID("count");            $filter->disableIdFilter();            $c=$filter->setName("c")->where(function ($query){//                $query->having("c",">=",$this->input);                return $this->input;            },'人数')->getColumn();            $filter->equal('cur_room','房间号');        });        $grid->model()->selectRaw('cur_room,count(*) as aggregate')->whereRaw('cur_room is not null && cur_room !=""')->groupBy("cur_room");        if(isset($_GET[$c])){            $grid->model()->havingRaw('aggregate >= ?',[$_GET[$c]]);        }        $grid->column('cur_room','房间号');        $grid->column('aggregate','人数');        $grid->disableActions();        $grid->disableCreateButton();

总体来说,这个解决形式还是有坑的,治标不治本。