【问题标题】:Laravel 8 - Call to a member function addEagerConstraints() on null [duplicate]Laravel 8 - 在 null 上调用成员函数 addEagerConstraints() [重复]
【发布时间】:2022-01-08 14:05:53
【问题描述】:

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

如果用户是客户端,我必须加载他们与我的客户端模型的关系,在提供者的情况下完全一样

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

$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;

    }

}

【问题讨论】:

  • 当您急切加载关系时,正在使用的实例是一个新的空模型实例,因此它没有带值的 type 属性(您不会从关系中返回任何内容方法,因为 null 不是这里的情况)...如果您想急切加载它,您不能在关系方法中动态地做这样的事情...这看起来像您想要一个多态关系
  • 感谢您的评论,我已经明白了,但我正在寻找的是知道在加载集合后是否有任何方法可以获得我需要的关系
  • 没有这些关系,因为它只获取集合中所有内容的所有 id,然后根据这些 id 获取记录,它没有在集合中的每个模型上调用此关系方法.. . 多态关系是唯一可能让你做你想做的事(不必旋转并为每个单独的模型自己做所有这些加载)
  • 始终在switch 中定义default: 大小写。在您的 switch 语句中添加 default 案例可能会解决您的问题。

标签: php laravel eloquent laravel-8 eloquent-relationship


【解决方案1】:

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

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

您可以通过在 users 表中使用 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;
});

【讨论】:

  • 非常感谢卢西亚诺的回答,这似乎是实现这种关系的更好解决方案
猜你喜欢
  • 2023-03-14
  • 2021-12-10
  • 2020-07-26
  • 2018-12-17
  • 1970-01-01
  • 2021-09-24
  • 2020-12-29
  • 2021-05-04
  • 2021-03-20
相关资源
最近更新 更多