使用连接表和ArrayCollection :: map

时间:2016-01-26 12:03:45

标签: doctrine-orm doctrine

我有实体“用户”和“代理商”。这些之间存在多对多关系,但由于两者之间存在连接数据,因此两个实体都具有与连接实体的OneToMany关系。

到目前为止一切顺利。但是,我有一个可能稍微不寻常的用例,因为删除用户后我的联接需要保持不变。这是因为有关已删除用户的其他一些数据仍留在其他地方,因此有必要了解与用户关联的代理商实体。

我在代理商实体上使用以下方法来获取用户:

public function getLinkedUsers(){
    return $this->userJoins->map(function(UserJoin $join){
        return $join->getUser();
    });
}

(其中userJoins是包含连接实体的ArrayCollection)

除非存在与现有用户记录无关的联接,否则此方法很有效。当发生这种情况时,一旦我开始遍历结果并调用它们上的方法,我就会收到错误:

  

ID为ID(10036)的“MyApp \ Entity \ User”类型的实体是   找不到

...我可以看到,这是Doctrine延迟加载实际实体的时间,就像之前它只是使用代理一样。

如何修改我的方法getLinkedUsers()以仅返回具有相应用户记录的联接?

1 个答案:

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

如果有人想告诉我一个更好的方法,我们欢迎他们,但这对我有用。