Laravel LiveWire无法直接显示Eloquent模型,仅数组包裹可用求助
Laravel LiveWire直接绑定Eloquent模型属性无内容的问题解决
问题描述
在LiveWire开发中,直接将Eloquent模型属性绑定到wire:model时,输入框无法显示内容;但将模型包裹在数组中后,绑定数组内的模型属性就能正常展示值,此前直接使用模型从未出现该异常。
代码示例
LiveWire组件类
<?php namespace App\Http\Livewire\Revision; use App\Models\Docs\ReqBusinessBasicInfo; use Livewire\Component; class BusinessBasicInfoComponent extends Component { public $doc_schema; public $schema_container; public function mount(int $business_id) { $this->doc_schema = ReqBusinessBasicInfo::find($business_id); $this->schema_container = [ $this->doc_schema ]; } public function render() { return view('livewire.revision.business-basic-infoo-component'); } }
Blade视图
<form> @csrf <x-text-input readonly disabled id="doc_schema.name" wire:model="doc_schema.name" /> <x-text-input readonly disabled id="schema_container.0.name" wire:model="schema_container.0.name" /> </form>
解决方法
方法1:提取模型属性到单独公共变量
将需要绑定的模型属性单独赋值给组件的公共属性,绕过模型直接绑定的序列化问题:
// 组件类中新增对应属性 public $doc_schema_name; public function mount(int $business_id) { $doc_schema = ReqBusinessBasicInfo::find($business_id); $this->doc_schema_name = $doc_schema->name; // 其他属性同理提取 }
视图中修改绑定:
<x-text-input readonly disabled id="doc_schema_name" wire:model="doc_schema_name" />
方法2:将模型转换为数组后赋值
把模型转换为数组形式再赋值给公共属性,让LiveWire直接处理数组键值:
public function mount(int $business_id) { $this->doc_schema = ReqBusinessBasicInfo::find($business_id)->toArray(); }
视图保持原绑定wire:model="doc_schema.name"即可正常显示。
方法3:升级LiveWire到最新稳定版
部分旧版本LiveWire存在直接绑定Eloquent模型属性的序列化bug,升级到最新版可解决此类问题。
方法4:检查模型序列化配置
确认模型类未通过$hidden属性隐藏目标字段,也未重写toArray()方法导致属性丢失(此方法仅针对特殊定制模型,数组能正常显示则大概率排除此问题)。
原因分析
当模型被包裹在数组中时,LiveWire序列化过程会对每个数组元素调用toArray(),正确提取模型属性;而直接将模型赋值给公共属性时,部分场景下LiveWire的序列化逻辑未正确解析模型的属性结构,导致前端无法获取到对应值。
内容的提问来源于stack exchange,提问作者Jovany González
相关产品推荐
相关产品推荐

