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

Laravel模型转数组时嵌套关联丢失问题排查

问题原因分析

你遇到的这个异常,核心原因大概率是模型的attributesToArray()方法执行时修改了关联的加载状态,导致后续调用relationsToArray()时嵌套关联丢失;而先将relationsToArray()结果存入变量,相当于提前保存了完整的关联数据,不受后续操作影响。

具体拆解可能的场景:

  • 访问器/修改器触发关联重加载:如果CustomField模型有自定义访问器(比如某个字段的getXXXAttribute方法),在attributesToArray()执行时会触发该访问器,若访问器里只重新加载了custom_field_type关联(未包含custom_field_type.custom_field_type_list_values),就会覆盖原本已经加载完整的关联,导致后续relationsToArray()返回的custom_field_type里没有内层的列表值。
  • 重写的模型方法干扰关联状态:如果CustomField或CustomFieldType重写了attributesToArray()、relationsToArray()方法,逻辑中存在修改关联加载状态的操作(比如卸载关联、重置关联缓存),也会导致直接合并时嵌套关联丢失。
  • PHP参数求值顺序的影响:array_merge的参数是从左到右求值的,直接写array_merge($model->attributesToArray(), $model->relationsToArray())时,会先执行attributesToArray(),再执行relationsToArray();如果前者的执行改变了模型的关联状态,后者返回的结果就会不完整。而先把relationsToArray()存入变量,相当于提前固定了关联的序列化结果,后续即使模型状态变化,变量里的数据也不受影响。

排查方向

  • 检查CustomField模型的所有访问器/修改器,确认是否有操作会重新加载custom_field_type关联,且未携带内层的custom_field_type_list_values。
  • 查看模型是否重写了attributesToArray()、relationsToArray()或toArray()方法,检查这些方法的逻辑是否会干扰关联的加载状态。
  • 单独测试两种调用顺序的结果:先调用$model->attributesToArray(),再打印$model->relationsToArray();对比先调用$relations = $model->relationsToArray(),再调用$model->attributesToArray()并打印$relations,看两者的custom_field_type部分是否存在差异。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 10:05:13