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 - 如何从一个解析器两次解析同一个控制器?

Laravel 5一次向多个用户发送邮件

Django Admin Cookbook-39如何两次向Django管理员添加模型

Laravel json() 响应返回值两次

如何访问嵌套的 json 对象? |在 Laravel 电子商务项目中显示订单]

如何在 Json Object Laravel Blade 中访问值