【发布时间】: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