laravel-admin导出部分数据,权限内数据
现在做admin遇到个需求,我们有很多渠道商,每个渠道商的数据不是互通的,那么我们就需要限制每个渠道商只能导出自己的数据.这时候使用laravel-admin自带的数据导出.结果出乎意料.因为默认都是导出整个数据的,及时你在初始化的时候指定每个渠道商只能查询自己的数据,但是导出却不是按照展示的数据来进行的.
研究了源码以后发现,laravel-admin是通过导出url的几个按钮来控制导出数据的,如下图所示,看最后面的这些就知道了.
D:\WWW\xxx\vendor\encore\laravel-admin\src\Grid\Concerns\CanExportGrid@getExportUrl产生的url
因此我们需要把我们渠道商的参数设置上去,我们来看一下他获取参数的方式,是使用request()->all(),那么,我们就可以使用下面的方式来设置url参数,这样的话渠道商就自己改不了他的渠道id,避免一些别有用心之人查看他人数据.
request()->offsetSet('channel_id', $channel_id);
改完之后,发现连接上面确实加上了这个参数,但是导出的时候仍旧没有起作用,还是导出了所有数据,这个时候我就猜到了,他导出的时候肯定是去比对了filter里面的字段,发现我们追加的参数不在指定字段内,因此就没有生效,无奈,就加了一个没有作用只是占位的channel_id字段,果不其然,解决了这个问题,说它是无用的字段,因为渠道商改不了,但是它的作用只是占个字段位置,避免导出的时候我们追加的参数被过滤掉.
$filter->column(1 / 2, function ($filter) use ($products) {
$filter->equal('product_id', trans('serialnumber.product_name'))->select($products);
$filter->equal('tag', trans('serialnumber.batch_number'));
// 就是下面这个占位置
$filter->equal('channel', trans('serialnumber.channel'))->default(request('channel'));
});
做完这些,导出数据就正常了,达到了预期.
还没有评论,来说两句吧...