Laravel 访问器两次向 json 对象提供信息
Posted
技术标签:
【中文标题】Laravel 访问器两次向 json 对象提供信息【英文标题】:Laravel accessors are giving json object the information twice 【发布时间】:2020-08-17 01:55:33 【问题描述】:所以,我有一个名为 product 的模型。这个产品有一个cpu的外键(cpu_id),它是另一个模型,包含了关于cpu的所有信息。 当将此模型(产品)转换为 JSON 对象时,我只得到 cpu_id,而不是 cpu 的所有信息(我已经定义了关系,并且它有效)。 所以我创建了一个名为“cpu_details”的访问器。现在,当我将产品转换为 json 时,我得到了关于 cpu 的信息加倍:来自 cpu,以及新定义的 cpu_details。为什么会这样? json有没有办法自动获取cpu的信息?
我的产品型号
class Product extends Model
protected $table = 'product';
protected $appends = ['cpu_details'];
public function getCpuDetailsAttribute()
return $this->cpu;
public function cpu()
return $this->belongsTo('App\Specs\CPU');
当我的产品在没有访问器的情况下转换为 json(使用 toJson() 函数)时,请注意我只得到 cpu_id,而不是 cpu 本身,但它从其他关系(如折扣)获取信息(另一个模型)。
id: 18,
stock: 10,
cpu_id: 2,
discounts: Array(1)
0: id: 5, val: "0.5", begindate: "2019-07-04", enddate: "2021-07-16"
length: 1
__proto__: Array(0)
现在这是我使用访问器转换为 json 时得到的信息,现在我得到了两次信息
id: 19,
stock: 10
cpu: id: 2, freq: "12", cores: 4, threads: 8, name: "Apple A12Z Bionic"
cpu_details: id: 2, freq: "12", cores: 4, threads: 8, name: "Apple A12Z Bionic"
cpu_id: 2
discounts: discounts: Array(1)
0: id: 4, val: "0.4", begindate: "2018-06-14", enddate: "2021-06-18"
length: 1
__proto__: Array(0)
【问题讨论】:
【参考方案1】:要访问cpu_details
,您需要加载关系cpu
,它将附加到您的产品对象。如果您只需要 cpu 详细信息,则应立即加载关系并像这样调用您的产品对象:
Product::with('cpu')->get();
现在,如果由于某种原因您真的想加载 cpu_details 而看不到 cpu,您也可以使用以下方法从 JSON 中隐藏 cpu
:
protected $hidden = ['cpu'];
【讨论】:
太完美了,效果很好!太感谢了。另外:有什么方法可以默认加载吗?含义:每次我得到一个产品时,cpu 都会急切地加载。 你可以!只需使用protected $with = ['cpu'];
正是我需要的!再次感谢:D以上是关于Laravel 访问器两次向 json 对象提供信息的主要内容,如果未能解决你的问题,请参考以下文章
Swinject - 如何从一个解析器两次解析同一个控制器?
Django Admin Cookbook-39如何两次向Django管理员添加模型