Laravel 8 - 在 null 时调用成员函数 addEagerConstraints()

Laravel 8 - Call to a member function addEagerConstraints() on null

我有一个可以是客户端或提供者的用户模型。 我需要的是根据用户类型加载不同的关系

如果用户是客户,我必须加载他们与我的客户模型的关系,并且在作为提供者的情况下完全相同

为此,我首先获取具有人员关系的个人数据(按预期工作),然后尝试加载条件关系,如下所示

$users = User::with('person')->get();
$users->load('entity');

但是在我的浏览器中,我收到这个错误

Error Call to a member function addEagerConstraints() on null

这是我关系的作用

public function entity() {

    switch($this->type) {

        case 'Client': 
            return $this->hasOne(Client::class,'id','client_id');
        break;

        case 'Provider':
            return $this->hasOne(Provider::class,'id','provider_id'); 
        break;

    }

}

那是因为您的某些用户不属于 ClientProvider 类型,因此由于您定义 entity() 关系的方式,某些用户可能不存在其中

避免关系中的任何条件并考虑在这种情况下使用多态关系,因为您的 User 模型可能与 1 个以上的模型相关 class。

您可以通过在 users table 中使用 entitable_idindentitable_type 并定义您的关系来简化模型和数据库,例如:

Entity.php model

public function entitable()
{
     return $this->morphTo();
}

----------------------------

Users.php model

public function entity()
{
    return $this->morphOne(Entity::class, 'entitable');
}

编辑: 如果你想保持这种方式,你可以尝试映射 $users

$users = $users->map(function($user){
     return $user->type == 'Client' || $user->type == 'Provider' ? $user->load('entity') : $user;
});