如何在Laravel Backpack中为多对多关联添加CRUD过滤器
多对多关联过滤器修复方案
原有代码的核心问题
- 没有使用CRUD实例自带的查询构造器:你在回调里单独写
Study::xxx->get()查询出来的结果不会被Backpack CRUD面板使用,自然不会生效,正确做法是直接修改$this->crud->query的查询条件 - 筛选方法不匹配输入类型:你用的是text文本类型过滤器,传入的
$value是字符串格式,不能用接收数组的whereIn方法 with('products')是关联预加载逻辑,只用来优化后续关联数据的查询性能,对Study列表的筛选没有任何作用,不需要加在筛选逻辑里
正确实现代码
$this->crud->addFilter([ 'type' => 'text', 'name' => 'products', 'label' => 'Produits' ], false, function($value) { $this->crud->query->whereHas('products', function($q) use($value) { // 精确匹配产品名称 $q->where('name', $value); // 如果需要模糊匹配,替换成下面这行即可 // $q->where('name', 'like', "%{$value}%"); }); });
补充说明
如果你需要支持同时筛选多个产品名称,可以把过滤器类型改成select2_multiple,同时给过滤器第二个参数传入产品名称的选项数组,这时候传入的$value就是数组格式,就可以用whereIn方法做筛选了。
内容的提问来源于stack exchange,提问作者Abdo Rabah
相关产品推荐
相关产品推荐

