You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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方法,而集合本身不存在该方法,从而触发错误。

解决方法

有两种常用方案可以解决这个问题:

  1. 转为普通支持集合
    通过collect()方法将分组后的Eloquent Collection转为Illuminate\Support\Collection,既保留集合的操作方法,又能被Livewire正常序列化:
$this->permissions = Permission::get(['name', 'id', 'display_name'])->groupBy('display_name')->collect();
  1. 转为数组
    使用toArray()将分组结果转为数组,虽然失去集合方法,但视图中循环使用不受影响:
$this->permissions = Permission::get(['name', 'id', 'display_name'])->groupBy('display_name')->toArray();

内容的提问来源于stack exchange,提问作者Shubham Sahu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:35:55