Laravel资源中如何仅显示is_vendor为true的用户
问题描述
我在Laravel中创建了users表,通过布尔字段区分用户角色(is_admin、is_user、is_vendor),表结构代码如下:
$table->id(); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->boolean("is_admin"); $table->boolean("is_user"); $table->boolean("is_vendor"); $table->rememberToken(); $table->timestamps();
当前我的Filament资源里有一个可搜索的关联字段,代码如下:
BelongsTo::make(__('Vendor'), 'User', User::class) ->searchable() ->sortable(),
这个字段现在会展示数据库里所有用户,我希望它只显示is_vendor为true的用户。我尝试了下面的代码但没有效果:
BelongsTo::make(__('Vendor'), 'User', User::class) ->searchable() ->sortable() ->search(function ($query, $search) { if (Auth::user()->hasRole("is_vendor")) { $query->where('id', Auth::id()); } }),
解决方案
你需要用options()方法过滤关联选项,search()仅处理搜索时的查询逻辑,不会影响默认的选项列表,这就是你之前代码无效的原因。
方法一:固定只显示供应商用户
直接在字段上添加options(),限制查询条件为is_vendor = true:
BelongsTo::make(__('Vendor'), 'User', User::class) ->searchable() ->sortable() ->options(fn () => User::where('is_vendor', true)->pluck('name', 'id')),
方法二:根据当前用户角色动态过滤
如果需要结合当前登录用户的角色做不同限制(比如供应商用户只能选自己),需要同时在options()和search()中保持一致的逻辑:
BelongsTo::make(__('Vendor'), 'User', User::class) ->searchable() ->sortable() ->options(function () { $query = User::query(); // 替换成你实际的角色判断逻辑 if (Auth::user()->hasRole("is_vendor")) { $query->where('id', Auth::id()); } else { $query->where('is_vendor', true); } return $query->pluck('name', 'id'); }) ->search(function ($query, $search) { $filteredQuery = $query->where('is_vendor', true); // 同样的角色判断逻辑 if (Auth::user()->hasRole("is_vendor")) { $filteredQuery->where('id', Auth::id()); } // 添加搜索匹配规则 $filteredQuery->where(function ($q) use ($search) { $q->where('name', 'like', "%{$search}%") ->orWhere('email', 'like', "%{$search}%"); }); }),
关键说明
options()控制下拉框的初始选项列表,必须在这里做过滤才能限制默认显示的内容。search()仅处理用户输入搜索关键词后的查询,所以要和options()的过滤规则对齐,避免搜索结果和选项列表不一致。
内容的提问来源于stack exchange,提问作者Renzo
相关产品推荐
相关产品推荐

