Laravel Resource集合关联属性项字段返回null如何解决?
Laravel API 关联字段返回null问题解决方案
问题根本原因
- 你通过join查询拿到的
prodescricao、provalor字段属于produto表,查询后是挂载在Atributo模型实例上的,并没有挂载到其关联的atributoitens子模型实例上,所以在AtributoitensResource中直接取$this->prodescricao必然为空。 - 你在查询后调用了
unique('id'),会把同一个Atributo关联的多条atributoitens记录去重,仅保留第一条,也会导致关联数据不全。
正确实现方案(Laravel推荐最佳实践:预加载关联)
步骤1:确认模型关联定义正确
首先在对应模型中声明关联关系:
Atributo模型中添加和Atributoitens的一对多关联
// app/Models/Atributo.php public function atributoitens() { return $this->hasMany(Atributoitens::class, 'atributo_id'); }
Atributoitens模型中添加和Produto的一对一关联
// app/Models/Atributoitens.php public function produto() { return $this->belongsTo(Produto::class, 'produto_id'); }
步骤2:修改控制器查询逻辑
去掉手动join,用with预加载关联数据,避免N+1查询问题:
public function show($id) { $atributos = Atributo::query() ->with(['atributoitens.produto']) // 预加载关联的属性项、以及属性项关联的产品 ->where('id', '=', $id) ->get(); return AtributoResource::collection($atributos); }
如果仅查询单条ID,也可以直接用findOrFail($id)替代get(),返回单个资源实例即可。
步骤3:修改AtributoitensResource字段取值逻辑
通过子模型关联的produto实例取产品字段:
public function toArray($request) { return [ 'id' => $this->id, 'atributo' => $this->atributo_id, 'produtos' => $this->produto_id, 'adicionais_descricao' => $this->produto?->prodescricao, // 空安全运算符兼容无关联产品的场景 'valor' => $this->produto?->provalor ]; }
内容的提问来源于stack exchange,提问作者josé nunes
相关产品推荐
相关产品推荐

