关于laravel:laraveladmin使用filter过滤聚合字段

2次阅读

共计 1569 个字符,预计需要花费 4 分钟才能阅读完成。

最近遇到一个需要,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();

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

正文完
 0