微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP-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,但似乎也没有.

有什么我想念的,我该如何解决呢?由我自己做插入?当然,这是一个解决方案,但这让我自己也可以执行查询,这是我不想做的事情.

好吧,谢谢
凯特·林

解决方法:

到目前为止,还没有找到最好的方法,但Boct似乎认为Doctrine假定您的联接表将是“自动生成的”,因此它假定它不需要也不需要两个联接键(UserId,RoleId).

我要解决的问题是停止使用ManyToMany,但使用与SecUserRole表的OnetoMany关系.因此,在addSecRole方法内部,我插入了新对象,然后在外部冲洗了EM(如上面的示例).

看来这是我能做的最好方法.我从http://www.zendcasts.com/那里得到了一个想法,其中有一个专门用于ManyToMany映射的演员表.

好吧,希望这对所有人有帮助

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐