处理返回null的belongsTo()

时间:2018-10-07 12:48:53

标签: laravel laravel-5 laravel-5.5

我有一个基于其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()

3 个答案:

答案 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'
        ]);
}