如何在Laravel Backpack列表中对belongsToMany关联列实现筛选
解决Laravel Backpack中belongsToMany关联的多用户筛选问题
问题根源
你当前的筛选代码无效,核心原因是错误地把users(模型的关联方法)当作数据库表字段使用whereIn条件——实际上users并非数据库字段,而是通过中间表tindaklanjut_user建立的关联关系,不能直接用于字段查询。
修正后的完整筛选代码
替换你原有的filter实现代码:
CRUD::filter('users') ->type('select2_multiple') ->values(function () { // 简化用户列表获取逻辑,直接返回id为键、名称为值的数组 return \App\Models\User::pluck('name', 'id')->toArray(); }) ->whenActive(function ($values) { $userIds = json_decode($values); // 通过whereHas筛选关联了指定用户的Tindaklanjut记录 CRUD::addClause('whereHas', 'users', function ($query) use ($userIds) { $query->whereIn('users.id', $userIds); }); });
可选场景:筛选同时包含所有选中用户的记录
如果你的需求是仅显示关联了所有选中用户的Tindaklanjut记录(而非关联任意一个即可),可以改用循环添加whereHas的方式:
->whenActive(function ($values) { $userIds = json_decode($values); foreach ($userIds as $userId) { CRUD::addClause('whereHas', 'users', function ($query) use ($userId) { $query->where('users.id', $userId); }); } });
确认关联模型正确性
你的Tindaklanjut模型关联定义是正确的,无需修改:
public function users(): BelongsToMany { return $this->belongsToMany(User::class, 'tindaklanjut_user', 'tindaklanjut_id', 'user_id'); }
内容的提问来源于stack exchange,提问作者Hani Ramadhan
相关产品推荐
相关产品推荐

