学说2似乎无法消除多对多的关系

时间:2011-01-03 13:34:34

标签: doctrine-orm

我有以下设置“许多用户可以拥有多个项目(协作者)

/**
 * @Entity @HasLifeCycleCallbacks
 * @Table(name="projects")
 */
class Project implements \Zend_Acl_Resource_Interface {
  /**
   * @ManyToMany(targetEntity="User", mappedBy="projects")
   * @OrderBy({"displayName" = "ASC", "username" = "ASC"})
   */
  protected $collaborators;

  ..
}

/**
 * @Entity 
 * @Table(name="users")
 */
class User implements \Zend_Acl_Role_Interface {
  /**
   * @ManyToMany(targetEntity="Project", inversedBy="collaborators")
   */
  protected $projects;
  ...
}

我尝试使用以下

删除协作者
$user = Application_DAO_User::findById($this->_getParam('userid'));
$proj = Application_DAO_Project::getProjectById($this->_getParam('id'));
Application_DAO_Project::removeCollaborator($proj, $user); // <---

// Application_DAO_User
public static function findById($id) {
  return self::getStaticEm()->find('Application\Models\User', $id);
}

// Application_DAO_Project
public static function getProjectById($id) {
  return self::getStaticEm()->find('Application\Models\Project', $id);
}

public static function removeCollaborator(Project $proj, User $collaborator) { // <---
  $proj->getCollaborators()->remove($collaborator);
  $collaborator->getProjects()->remove($proj);
  self::getStaticEm()->flush();
}

并且没有任何错误,但数据库保持不变......

2 个答案:

答案 0 :(得分:3)

这可能已经过期,但我自己也遇到了同样的问题...根据the doctrine 2 documents,函数ArrayCollection->remove($i)用于按数组索引删除。

你所追求的是:

getCollaborators()->removeElement($collaborator);

答案 1 :(得分:1)

我绕圈试图解决这个问题,直到我意识到这一点起作用:

getCollaborators()->removeElement($collaborator);

$ collaborator必须是协作者ArrayCollection中的实际对象。也就是说,如果传入具有相同参数的新Collaborator对象,则不会将其删除。这是因为ArrayCollection使用array_search来查找要删除的对象。

希望能在几个小时内拯救别人......