Doctrine2 ManyToMany не выполняет события слушателя
У меня есть следующая структура БД:
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
1 ответ
До сих пор не найдено лучшего способа, НО кажется, что Doctrine предполагает, что ваша таблица соединений будет "автоматически сгенерирована", поэтому она предполагает, что ей не нужно и не нужно больше, чем два соединяющих ключа (UserId, RoleId).
Чтобы решить эту проблему, я прекратил использовать ManyToMany, но использовал отношение OneToMany к таблице SecUserRole. Поэтому внутри метода addSecRole я вставил новый объект, а затем сбросил EM снаружи (как в примере выше).
Кажется, это лучший способ, которым я мог бы заниматься. Я получил идею от этого http://www.zendcasts.com/ где есть один бросок специально для сопоставлений ManyToMany.
Ну, надеюсь, это поможет всем