Livewire 3中mount方法使用groupBy赋值公共变量报错
问题:Livewire中赋值分组后的Eloquent Collection到公共变量时报错
在Livewire组件中,将Eloquent Collection经过groupBy处理后赋值给公共属性时会触发错误,但仅在局部变量中使用或转为数组/普通集合时可正常运行,且该问题在Livewire 2中不存在。
组件代码
public $permissions; public function mount() { // 赋值给公共变量时报错 $this->permissions = Permission::get(['name', 'id', 'display_name'])->groupBy('display_name'); // 局部变量中使用正常 // $permissions = Permission::get(['name', 'id', 'display_name'])->groupBy('display_name'); // 转为普通集合或数组后赋值正常 // $this->permissions = Permission::get(['name', 'id', 'display_name'])->groupBy('display_name')->collect(); // $this->permissions = Permission::get(['name', 'id', 'display_name'])->groupBy('display_name')->toArray(); }
错误信息
Method Illuminate\Database\Eloquent\Collection::getMorphClass does not exist.
问题原因
Livewire在序列化组件数据同步到前端时,无法正确处理groupBy后的Eloquent Collection。groupBy返回的仍是Illuminate\Database\Eloquent\Collection实例,但内部结构变为嵌套集合,序列化过程中会尝试调用Eloquent模型的getMorphClass方法,而集合本身不存在该方法,从而触发错误。
解决方法
有两种常用方案可以解决这个问题:
- 转为普通支持集合
通过collect()方法将分组后的Eloquent Collection转为Illuminate\Support\Collection,既保留集合的操作方法,又能被Livewire正常序列化:
$this->permissions = Permission::get(['name', 'id', 'display_name'])->groupBy('display_name')->collect();
- 转为数组
使用toArray()将分组结果转为数组,虽然失去集合方法,但视图中循环使用不受影响:
$this->permissions = Permission::get(['name', 'id', 'display_name'])->groupBy('display_name')->toArray();
内容的提问来源于stack exchange,提问作者Shubham Sahu
相关产品推荐
相关产品推荐

