Я использую Laravel Filament (3.0) и создал модель Resource for Court, которая отлично работает.
У меня есть поле role_id в таблице профилей, связанное с идентификатором в таблице ролей, и поле Court_id в отношениях таблицы профилей с идентификатором в таблице суда.
Мне нужно отобразить атрибут Profile.name в столбце «Судья» на ресурсе суда, где Court_id = идентификатор суда строки и role_id = 4
Могу ли я добавить условие в нити, чтобы получить это?
Таблица ресурсов суда
return $table
->columns([
Tables\Columns\TextColumn::make('name')
->label('Court Name')
->searchable(),
Tables\Columns\TextColumn::make('profile.fullname')
->label('Judge')
->sortable(),
])
Модель Суда
public function profile()
{
return $this->belongsTo(Profile::class);
}
ПрофильМодель
public function court()
{
return $this->hasOne(Court::class);
}
public function role()
{
return $this->hasOne(Role::class);
}
РолеваяМодель
public function profile()
{
return $this->belongsToMany(Profile::class);
}






Во-первых, убедитесь, что ваши отношения правильно настроены в ваших моделях.
Профили, вероятно, принадлежат Двору и Роли, а не наоборот.
ProfileModel
public function court()
{
return $this->belongsTo(Court::class, 'court_id');
}
public function role()
{
return $this->belongsTo(Role::class, 'role_id');
}
CourtModel
public function profiles()
{
return $this->hasMany(Profile::class, 'court_id');
}
RoleModel
public function profiles()
{
return $this->hasMany(Profile::class, 'role_id');
}
Теперь, чтобы отобразить profile.name, где role_id = 4 и Court_id соответствуют идентификатору суда в строке, вам, вероятно, потребуется создать специальный столбец, который вычисляет значение на лету. Вы можете использовать пользовательский метод доступа к модели Court или вычисляемый столбец непосредственно в ресурсе Filament.
Add a method to the Court model to get the judge's name:
public function getJudgeNameAttribute()
{
$judge = $this->profiles()->where('role_id', 4)->first();
return $judge ? $judge->name : 'No Judge Assigned';
}
Затем используйте этот метод доступа в таблице Filament:
return $table
->columns([
Tables\Columns\TextColumn::make('name')
->label('Court Name')
->searchable(),
Tables\Columns\TextColumn::make('judge_name')
->label('Judge')
->sortable(),
]);
Or you can also do,
Определите вычисляемый столбец непосредственно в ресурсе Filament, не изменяя модель:
return $table
->columns([
Tables\Columns\TextColumn::make('name')
->label('Court Name')
->searchable(),
Tables\Columns\TextColumn::make('profiles')
->getStateUsing(fn ($record) => $record->profiles()->where('role_id', 4)->first()->name ?? 'No Judge Assigned')
->label('Judge')
->sortable(),
]);
Никаких проблем, рад помочь вам.
Большое спасибо, я не был уверен, можно ли это сделать прямо в ресурсе или нужно было через модель. Оба решения верны. Мне просто пришлось изменить имя метода в функции Profiles на Profile, поскольку в модели он называется именно так. Теперь я могу создавать больше подобных функций, используя метод getStateUsing. Большое вам спасибо.