如何在Laravel Orchid同页面多表场景下使用搜索筛选器?
解决Orchid Laravel Http Filter多表筛选冲突问题
Orchid Laravel的Http Filter可对allowedFilters中定义的列进行搜索,筛选值会传递至指定筛选方法,但在同页面存在多张表的场景下,由于筛选参数未绑定模型/表名,Http Filter会作用于页面内所有表。例如请求filter[status][]=1时,该status筛选会应用到所有含status列的表。针对这个问题,完全可以通过给筛选参数绑定模型/表标识来区分目标表,具体实现方式如下:
1. 自定义Filter类时指定专属前缀
为每个表对应的Filter类重写prefix方法,给筛选参数加上专属前缀,以此区分不同表的筛选条件:
use Orchid\Filters\HttpFilter; // 订单表筛选类 class OrderFilter extends HttpFilter { protected $allowedFilters = [ 'status' => 'exact', // 其他筛选字段 ]; public function prefix(): string { return 'order_'; // 订单表筛选参数的专属前缀 } } // 用户表筛选类 class UserFilter extends HttpFilter { protected $allowedFilters = [ 'status' => 'exact', // 其他筛选字段 ]; public function prefix(): string { return 'user_'; // 用户表筛选参数的专属前缀 } }
使用时,请求参数就可以写成filter[order_status][]=1(仅作用于订单表)、filter[user_status][]=2(仅作用于用户表),彻底避免筛选条件的冲突。
2. 动态创建Filter时指定前缀
如果不想为每个表单独创建Filter类,也可以在查询构建时动态生成带前缀的Filter:
use Orchid\Filters\HttpFilter; // 订单表查询 $orders = Order::filter(new class extends HttpFilter { protected $allowedFilters = [ 'status' => 'exact', ]; public function prefix(): string { return 'order_'; } })->get(); // 用户表查询 $users = User::filter(new class extends HttpFilter { protected $allowedFilters = [ 'status' => 'exact', ]; public function prefix(): string { return 'user_'; } })->get();
前端对应调整
前端提交筛选参数时,需要将表单控件的name属性对应设置为带前缀的格式,比如filter[order_status]或filter[user_status],确保参数能被对应表的Filter正确识别。
内容的提问来源于stack exchange,提问作者git push origin master
相关产品推荐
相关产品推荐

