Laravel中如何访问getOriginal()获取的原始模型关联关系?
解决Laravel中getOriginal()无法访问关联关系的问题
嘿,这个问题我之前在项目里也碰到过!咱们先搞清楚为啥$original_item["qualification"]访问不了,再给你几个可行的解决办法:
问题根源
getOriginal()方法的核心作用是返回当前模型自身从数据库查询出来后未被修改的原始字段值——也就是对应你order_items表的所有列,比如id、qualification_id这些。而你预加载的qualification关联是通过额外的SQL查询获取的关联模型数据,它不属于当前OrderItem模型的自身属性集合,所以自然不会出现在getOriginal()的返回结果里。
可行的解决方法
方法1:直接获取关联模型的原始数据
如果你的qualification关联模型没有被修改过,或者你需要的是它的原始状态,直接在关联模型上调用getOriginal()就行:
$item = OrderItem::where('id', $id)->with('qualification')->first(); // 获取OrderItem自身的原始数据 $original_item = $item->getOriginal(); // 获取关联模型的原始数据(注意判断关联是否存在) $original_item['qualification'] = $item->qualification ? $item->qualification->getOriginal() : null;
这样就能把关联的原始数据合并到$original_item里了。
方法2:重新查询关联获取原始状态
如果你担心当前加载的qualification已经被修改过,想直接从数据库拉取最原始的关联数据,可以通过关联查询重新获取:
$item = OrderItem::where('id', $id)->first(); $original_item = $item->getOriginal(); // 重新查询关联,拿到数据库中的原始数据 $original_item['qualification'] = $item->qualification()->first();
这种方式会发起一次新的SQL查询,确保拿到的是数据库里的最新(未被当前模型实例修改的)关联数据。
方法3:自定义方法封装逻辑
如果这个需求在项目里经常用到,可以给模型添加一个自定义方法,方便复用:
// 在OrderItem模型中添加 public function getOriginalWithRelations(array $relations) { $original = $this->getOriginal(); foreach ($relations as $relation) { if ($this->relationLoaded($relation)) { $original[$relation] = $this->$relation->getOriginal(); } else { // 如果关联没预加载,可选择重新查询或者设为null $original[$relation] = $this->$relation()->first()?->getOriginal(); } } return $original; }
使用的时候就很方便:
$item = OrderItem::where('id', $id)->with('qualification')->first(); $original_item = $item->getOriginalWithRelations(['qualification']); // 现在可以正常访问$original_item['qualification']了
内容的提问来源于stack exchange,提问作者molerat
相关产品推荐
相关产品推荐

