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;
不起作用?
很难说这里可能是什么问题,但是:
- 确保您的模特没有
supplier
演员表
确保您没有使用 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
)进行访问,所以我需要立即加载的任何关系都会显示给我。
当前应用中,有模型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;
不起作用?
很难说这里可能是什么问题,但是:
- 确保您的模特没有
supplier
演员表 确保您没有使用
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
)进行访问,所以我需要立即加载的任何关系都会显示给我。