Doctrine2 ManyToMany не выполняет события слушателя - PullRequest
1 голос
/ 03 октября 2011

У меня следующая структура БД:

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. Ни один не получить новую запись. Я пробовал на Flash, но, похоже, он тоже не получил.

Есть ли что-то, чего мне не хватает, как я могу решить это? делать вставки самостоятельно? Конечно, это решение, но это оставляет мне возможность самостоятельно выполнять запросы, что я не хочу делать.

Ну, заранее спасибо KAT LIM

1 Ответ

0 голосов
/ 03 октября 2011

Пока что не нашли лучшего способа, НО кажется, что Doctrine предполагает, что ваша таблица соединений будет «автоматически сгенерирована», поэтому она предполагает, что ей не нужно и не нужно больше, чем два соединяющих ключа (UserId, RoleId).

Чтобы решить эту проблему, я прекратил использование ManyToMany, но использовал отношение OneToMany к таблице SecUserRole.Поэтому внутри метода addSecRole я вставил новый объект, а затем сбросил EM снаружи (как в примере выше).

Кажется, это лучший способ, который я мог сделать.Я получил идею из этого http://www.zendcasts.com/, где есть один бросок специально для отображений ManyToMany.

Что ж, надеюсь, это поможет всем

...