我有以下数据库结构:
User > UserRole < Role
UserId UserRoleId RoleId
Name UserId Name
RoleId
Active
CreationDate
我的doctrine2类定义如下:
/**
* @var Roles
*
* @ORM\ManyToMany(targetEntity="SecRole")
* @ORM\JoinTable(name="SEC_USER_ROLE",
* joinColumns={@ORM\JoinColumn(name="SEC_USER_ID", referencedColumnName="SEC_USER_ID")},
* inverseJoinColumns={@ORM\JoinColumn(name="SEC_ROLE_ID", referencedColumnName="SEC_ROLE_ID")}
* )
*/
private $userRoles;
public function __construct() {
parent::__construct();
$this->userRoles = new \Doctrine\Common\Collections\ArrayCollection();
}
public function addSecRole(\myEntity\SecRole $role)
{
$exists = $this->userRoles->exists(function($key, $elem) use($role) {
return isset($elem) && $elem->getSecRoleCode() == $role->getSecRoleCode();
});
return !$exists && $this->userRoles->add($role);
}
要向用户添加新角色,请执行以下操作:
$r = $rolerep->findOneBySecRoleCode('SystemAdmin');
$u = $userrep->findOneByUserLogin('sysadmin');
if (isset($r) && isset($u))
{
if ($u->addSecRole($r)) {
$em->flush();
}
}
除了一件事,一切都很好。没有为SecUserRole实体调用生命周期事件!我怀疑是因为Doctrine正在为自己“添加”新的SecUserRole记录,所以它不会为它调用事件。
我正在听prePersist,preUpdate,preDelete。都没有得到新的记录。我试过onFlush,但它似乎也没有得到它。
有什么我想念的,我怎么能解决这个问题?自己做插页?当然这是一个解决方案,但这让我自己也做了查询,这是我不想做的事情。
嗯,提前谢谢 KAT LIM
答案 0 :(得分:0)
到目前为止,还没有找到最好的方法但是看起来Doctrine假设您的Join Table将“自动生成”,所以它假设它没有或只需要两个连接键(UserId,RoleId)。
我要解决的问题是停止使用ManyToMany,但使用OneToMany关系来使用SecUserRole表。所以在 addSecRole 方法中,我插入了新对象,然后在外面刷新EM(如上例所示)。
这似乎是我能做的最好的方式。我从这个http://www.zendcasts.com/得到了这个想法,其中有一个特别为ManyToMany映射的转换。
嗯,希望这有助于所有