Доктрина 2 не может удалить многие из многих отношений - PullRequest
1 голос
/ 03 января 2011

У меня есть следующая настройка: " У многих пользователей может быть много проектов (соавторов) "

/**
 * @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 ]

3 голосов
/ 28 августа 2011

Это может быть уже давно, но я сам столкнулся с той же проблемой ... Согласно доктрина 2 документа , функция ArrayCollection->remove($i) предназначена для удаления по индексу массива.

Что вы ищете:

getCollaborators()->removeElement($collaborator);
1 голос
/ 14 апреля 2012

Я ходил кругами, пытаясь понять это, пока не понял, что это сработает:

getCollaborators()->removeElement($collaborator);

$ сотрудник должен быть фактическим объектом из коллаборации ArrayCollection. То есть, если вы передадите новый объект Collaborator с такими же параметрами, он не будет удален. Это потому, что ArrayCollection использует array_search для поиска объекта, который вы хотите удалить.

Надеюсь, что спасет кого-то еще несколько часов ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...