You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 06:25:33