Laravel 属性未按预期工作

Laravel attribute not working as expected

当前应用中,有模型Part和模型Supplier。每个零件都有一个供应商。

    public function supplier()
    {
        return $this->belongsTo(Supplier::class);
    }

我添加了一个访问器来获取供应商的名称。

如果我 return 整个数据集,我得到供应商:

    public function getSupplierNameAttribute()
    {
        return $this->supplier;
    }
    "supplierName": {
        "id": 1,
        "uuid": "37e3a715-09d3-4fac-ae88-8f12e63fe79c",
        "name": "Laserteam",
        "street": "8602 Dessie Tunnel",
        "zip": "15869",
        "city": "New Clementview",
        "email_send_type": null,
        "active": 0,
        "created_at": "2020-01-09 09:46:02",
        "updated_at": "2020-01-09 09:46:02",
        "deleted_at": null,
        "action": "",
        "activeLabel": "<span class='badge badge-secondary'>Inaktiv<\/span>"
    },

如果我只尝试获取名称(我最终需要的),则会出现错误:

    public function getSupplierNameAttribute()
    {
        return $this->supplier->name;
    }
ErrorException: Trying to get property 'name' of non-object in file /gopanel/sites/7industry_net/public/7time/app/Models/Part/PartAttribute.php on line 48

如果我以这种方式尝试,它会起作用:

    public function getSupplierNameAttribute()
    {
        return $this->supplier['name'];
    }

为什么 return $this->supplier->name; 不起作用?

很难说这里可能是什么问题,但是:

  1. 确保您的模特没有 supplier 演员表
  2. 确保您没有使用 supplier 作为数据库列名,或者您没有在某处制作这样的东西

    $this->supplier = $this->supplier->toArray();
    

似乎 supplier 属性 某个地方变成了数组,这就是为什么一个符号有效而另一个无效的原因。

试试这个代码

public function getSupplierNameAttribute()
{
    return $this->supplier->name ?? 'supplier not exists';
}

我不太确定那里发生了什么;如果您有 supplier 关系,那么访问 属性 应该 延迟加载关系。

或者,您可以尝试以下语法:

public function getSupplierNameAttribute()
{
    $this->loadMissing('supplier');

    return $this->getRelation('supplier')->name;
}

但是,我会避免这样定义访问器。如果你说,它可能会导致 N+1 问题,检索部分的集合,然后在每个部分上调用 $part->supplier_name,而不急切加载 supplier 关系。

就我个人而言,如果我正在访问归因于关系,我更喜欢通过关系(即 $part->supplier->name)进行访问,所以我需要立即加载的任何关系都会显示给我。