我有实体“用户”和“代理商”。这些之间存在多对多关系,但由于两者之间存在连接数据,因此两个实体都具有与连接实体的OneToMany关系。
到目前为止一切顺利。但是,我有一个可能稍微不寻常的用例,因为删除用户后我的联接需要保持不变。这是因为有关已删除用户的其他一些数据仍留在其他地方,因此有必要了解与用户关联的代理商实体。
我在代理商实体上使用以下方法来获取用户:
public function getLinkedUsers(){
return $this->userJoins->map(function(UserJoin $join){
return $join->getUser();
});
}
(其中userJoins是包含连接实体的ArrayCollection)
除非存在与现有用户记录无关的联接,否则此方法很有效。当发生这种情况时,一旦我开始遍历结果并调用它们上的方法,我就会收到错误:
ID为ID(10036)的“MyApp \ Entity \ User”类型的实体是 找不到
...我可以看到,这是Doctrine延迟加载实际实体的时间,就像之前它只是使用代理一样。
如何修改我的方法getLinkedUsers()
以仅返回具有相应用户记录的联接?
答案 0 :(得分:0)
好的,我找到了解决方案。
在连接实体的ManyToOne定义中,指定fetch =“EAGER”
/**
* @var User
* @ORM\ManyToOne(targetEntity="User", inversedBy="userJoins", fetch="EAGER")
* @ORM\JoinColumn(name="user_id")
*/
private $user;
回到原子能机构实体,我的修正方法:
public function getLinkedUsers(){
$joinsWithRealUsers = $this->userJoins->filter(function(UserJoin $join){
return $join->getUser();
});
return $joinsWithRealUsers->map(function(UserJoin $join){
return $join->getUser();
});
}
如果有人想告诉我一个更好的方法,我们欢迎他们,但这对我有用。