原则2 多对多不执行侦听器事件



我有以下数据库结构:

User     > UserRole      < Role
UserId     UserRoleId      RoleId
Name       UserId          Name
           RoleId
           Active
           CreationDate

我的doctrine2类是这样定义的:

/**
 * @var Roles
 *
 * @ORMManyToMany(targetEntity="SecRole")
 * @ORMJoinTable(name="SEC_USER_ROLE",
 *      joinColumns={@ORMJoinColumn(name="SEC_USER_ID", referencedColumnName="SEC_USER_ID")},
 *      inverseJoinColumns={@ORMJoinColumn(name="SEC_ROLE_ID", referencedColumnName="SEC_ROLE_ID")}
 *      )
 */
private $userRoles;
public function __construct() {
  parent::__construct();
  $this->userRoles = new DoctrineCommonCollectionsArrayCollection();
}
public function addSecRole(myEntitySecRole $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

到目前为止,还没有找到最好的方法,但似乎学说假设你的连接表将"自动生成",所以它假设它没有也不需要超过两个连接键(UserId, RoleId)。

我做了什么来解决它是停止使用多多,但使用一个多的关系SecUserRole表。因此,在addSecRole方法中,我插入了新对象,然后在外部刷新了EM(如上面的示例)。

这似乎是我能做的最好的办法。我从这个http://www.zendcasts.com/得到了这个想法,那里有一个专门用于manymany映射的cast。

好吧,希望这对大家有帮助

最新更新