Laravel预加载memoryof关联时报集合实例不存在该属性异常是什么原因?
异常触发原因
你遇到的这个异常核心原因是你直接对集合实例调用了仅属于单个模型的关联属性,具体逻辑如下:
- 你执行的代码
$events = Event::with('memoryof')->get()->sortByDesc('created_at');最终返回的是Illuminate\Database\Eloquent\Collection集合对象,不是单个Event模型实例:get()方法执行查询后就会返回包含所有匹配Event模型的集合sortByDesc是集合的排序方法,执行后仍然返回集合对象
memoryof是你在Event模型中定义的关联属性,仅属于单个Event模型对象,Collection类本身没有定义这个属性,所以当你写出类似$events->memoryof的代码时,就会抛出「Property [memoryof] does not exist on this collection instance」异常。
正确使用方式
你需要先从集合中取出单个Event模型,再访问关联属性,常见用法有三种:
- 遍历集合逐个访问关联属性:
foreach ($events as $event) { // 单个Event模型可正常调用关联属性 $currentMemories = $event->memoryof; // 处理业务逻辑 }
- 取集合中指定位置的模型再访问:
// 取第一条事件的关联memoryof数据 $firstEventMemories = $events->first()->memoryof; // 取下标为1的事件的关联memoryof数据 $secondEventMemories = $events->get(1)->memoryof;
- 如果你需要把所有事件的关联memoryof数据合并为一个集合,可以使用pluck方法:
$allMemories = $events->pluck('memoryof')->flatten()->filter();
内容的提问来源于stack exchange,提问作者Dan'l
相关产品推荐
相关产品推荐

