如何配置Filament Select组件以显示客户的名字与姓氏?
解决Filament Select组件同时显示客户名字和姓氏的问题
Filament的relationship方法第二个参数仅接受单个字段名,传数组确实无效,给你两种可行的解决办法:
方法1:在Customer模型里加访问器(推荐,全局复用)
在你的Customer模型中定义一个拼接姓名的访问器,这样不仅Select组件能用,其他业务场景也能直接调用这个字段:
// app/Models/Customer.php use Illuminate\Database\Eloquent\Casts\Attribute; class Customer extends Model { // ... 其他模型代码 protected function fullName(): Attribute { return Attribute::make( get: fn ($_, $attributes) => "{$attributes['name']} {$attributes['lastname']}", ); } }
然后修改Form中的Select配置,把显示字段换成这个访问器:
Select::make('customer_id') ->relationship('customer', 'full_name') // 用定义好的full_name访问器 ->searchable(['name', 'lastname']) // 搜索依然针对原字段 ->preload() ->required() ->createOptionForm([ TextInput::make('name') ->required() ->label('Nombre'), TextInput::make('surname') ->required(), TextInput::make('lastname') ->label('Last Name') ]),
方法2:直接在Select组件自定义选项标签(局部修改)
如果不想改动模型,直接在Select里用getOptionLabelUsing方法拼接字段值:
Select::make('customer_id') ->relationship('customer', 'name') // 这里随便传一个存在的字段即可,后面会覆盖标签 ->getOptionLabelUsing(fn ($record) => "{$record->name} {$record->lastname}") ->searchable(['name', 'lastname']) ->preload() ->required() ->createOptionForm([ TextInput::make('name') ->required() ->label('Nombre'), TextInput::make('surname') ->required(), TextInput::make('lastname') ->label('Last Name') ]),
两种方法都能实现下拉选项同时显示名字和姓氏,按需选择就行。
内容的提问来源于stack exchange,提问作者Daniel Unam
相关产品推荐
相关产品推荐

