Laravel Voyager开发:表单传输列前端仅显示值而非标签的问题
Laravel Voyager: 获取表单选项的显示文本而非存储键值
我之前也碰到过完全一样的问题!其实这是Voyager的正常行为——你在BREAD JSON配置里设置的options只是给后台管理界面渲染下拉框用的,数据库里实际存储的是你定义的键(比如option1),所以直接调用$car->transmission拿到的自然是存储的键值,而不是对应的显示文本。
这里有几个实用的解决方法:
方法1:使用Voyager内置的Helper方法
Voyager提供了现成的方法来获取选项的标签,直接在Blade模板或者代码里调用就行:
{{ Voyager::getOptionLabel($car, 'transmission') }}
这个方法会自动从对应模型的BREAD配置里读取选项,返回对应的显示文本,非常省心。
方法2:在模型中自定义访问器
如果想更灵活地控制,或者不想每次都调用Voyager的Helper,可以在你的Car模型里添加一个访问器:
public function getTransmissionLabelAttribute() { // 这里可以直接复用你在BREAD里定义的选项 $transmissionOptions = [ 'option1' => 'Automática', 'option2' => 'Manual' ]; // 用??处理不存在的键,避免报错 return $transmissionOptions[$this->transmission] ?? $this->transmission; }
之后在前端就可以通过$car->transmission_label来获取对应的显示文本了。
方法3:从BREAD配置中动态读取选项(推荐)
如果担心后台修改了BREAD的选项后,模型里的配置没同步,可以动态从Voyager的DataType模型中读取配置:
public function getTransmissionLabelAttribute() { // 替换成你的模型对应的BREAD slug $dataType = \TCG\Voyager\Models\DataType::where('slug', 'cars')->firstOrFail(); // 找到transmission字段的配置 $field = collect($dataType->fields)->firstWhere('field', 'transmission'); // 获取选项数组 $options = $field->details['options'] ?? []; return $options[$this->transmission] ?? $this->transmission; }
这样不管后台怎么修改选项,前端都会自动同步,不用手动更新模型代码。
总结一下:Voyager不会自动把存储的键值转换成显示文本,需要我们通过上述方法手动映射,其中方法1和方法3都是复用后台配置的方式,更推荐使用,避免重复维护配置。
内容的提问来源于stack exchange,提问作者Pedro
相关产品推荐
相关产品推荐

