我有一个基于其ID返回客户对象的模型(请求),它从另一台机器接收ID,因此我想处理不存在的值(即,不存在的ID将雄辩者返回为null)
如此:
public function customer()
{
return $this->belongsTo('App\Customer', 'site_user');
}
我尝试了以下操作:
public function getSiteUserAttribute()
{
if (!$this->relationLoaded('customer')) {
$this->load('customer');
}
return $this->getRelation('customer') ?: $this->nullCustomer();
}
和nullCustomer()
:
private function nullCustomer()
{
$nonExist = 'non-exist-customer';
$siteUser = new \Illuminate\Support\Collection;
$siteUser->first_name = $nonExist;
$siteUser->last_name = $nonExist;
$siteUser->email = $nonExist;
return $siteUser;
}
Laravel返回一个我无法理解的错误:
Undefined property: App\Request::$site_user (View: /../../index.blade.php)`
显然与getSiteUserAttribute()
推断site_user
有关,但我不明白是什么问题。
我可以在调用此关系的每个位置isset()
,但是我使用的是智能框架,因此我怀疑这是否是最佳实践。
只需重申一下,我正在尝试不破坏视图的空belongsTo()
。
答案 0 :(得分:1)
重写nullCustomer()
以返回App\Customer
而不是\Illuminate\Support\Collection
:
我还没有测试过。
private function nullCustomer()
{
$nonExist = 'non-exist-customer';
$siteUser = new \App\Customer;
$siteUser->first_name = $nonExist;
$siteUser->last_name = $nonExist;
$siteUser->email = $nonExist;
return $siteUser;
}
答案 1 :(得分:1)
似乎site_user字段和site_user属性是混合的。
摆脱混乱的最简单方法,将字段重命名为site_user_id
答案 2 :(得分:1)
正如Murat Tutumlu所说,您不能同时具有site_user
属性和getSiteUserAttribute()
访问器。
您可以使用withDefault()
指定默认值:
public function customer()
{
return $this->belongsTo('App\Customer', 'site_user')
->withDefault([
'first_name' => 'non-exist-customer',
'last_name' => 'non-exist-customer',
'email' => 'non-exist-customer'
]);
}