我有以下设置“许多用户可以拥有多个项目(协作者)”
/**
* @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();
}
并且没有任何错误,但数据库保持不变......
答案 0 :(得分:3)
这可能已经过期,但我自己也遇到了同样的问题...根据the doctrine 2 documents,函数ArrayCollection->remove($i)
用于按数组索引删除。
你所追求的是:
getCollaborators()->removeElement($collaborator);
答案 1 :(得分:1)
我绕圈试图解决这个问题,直到我意识到这一点起作用:
getCollaborators()->removeElement($collaborator);
$ collaborator必须是协作者ArrayCollection中的实际对象。也就是说,如果传入具有相同参数的新Collaborator对象,则不会将其删除。这是因为ArrayCollection使用array_search来查找要删除的对象。
希望能在几个小时内拯救别人......