如何在Laravel Filament 3.0的Court Resource中添加WHERE条件
解决方案
第一步:修正模型关联错误
当前你的模型关联存在逻辑问题,先调整为正确的关联关系:
- Court 模型:添加专属关联方法,用于获取当前法院下
role_id=4的法官Profile:
// Court.php public function judge() { // 关联并筛选role_id=4的Profile return $this->hasOne(Profile::class)->where('role_id', 4); } // 可选:添加获取该法院所有人员的关联 public function profiles() { return $this->hasMany(Profile::class); }
- Profile 模型:修正
court和role关联为belongsTo(因为profiles表包含court_id和role_id外键):
// Profile.php public function court() { return $this->belongsTo(Court::class); } public function role() { return $this->belongsTo(Role::class); }
- Role 模型:修正
profile关联为hasMany:
// Role.php public function profiles() { return $this->hasMany(Profile::class); }
第二步:在Filament Court Resource中显示法官姓名
提供两种实现方式,按需选择:
方式一:使用自定义关联(推荐)
直接调用Court模型中定义的judge关联,在表格列中显示姓名:
// CourtResource.php return $table ->columns([ Tables\Columns\TextColumn::make('name') ->label('Court Name') ->searchable(), Tables\Columns\TextColumn::make('judge.fullname') ->label('Judge') ->sortable() ->default('无对应法官'), // 无匹配数据时显示默认文本 ]);
方式二:使用getStateUsing动态获取
如果不想修改模型关联,可直接在列中通过回调筛选数据:
// CourtResource.php use Illuminate\Database\Eloquent\Builder; return $table ->columns([ Tables\Columns\TextColumn::make('name') ->label('Court Name') ->searchable(), Tables\Columns\TextColumn::make('judge') ->label('Judge') ->getStateUsing(function (Court $record) { // 从当前法院的人员中筛选role_id=4的记录 $judge = $record->profiles()->where('role_id', 4)->first(); return $judge?->fullname ?? '无对应法官'; }) // 支持排序功能 ->sortable(query: function (Builder $query, string $direction) { return $query->leftJoin('profiles', 'courts.id', '=', 'profiles.court_id') ->where('profiles.role_id', 4) ->orderBy('profiles.fullname', $direction) ->select('courts.*'); }), ]);
内容的提问来源于stack exchange,提问作者Coder Dev
相关产品推荐
相关产品推荐

