У меня есть небольшой проект в Symfony2 и доктрина, и я пытаюсь обновить 2 связанных объекта:
Участники и автомобили
$carMembers = $car->getMembers(); echo count($carMembers); // --> show 2 echo get_class(carMembers[0]); // --> show MyCars\WSBundle\Entity\Member $car->removeMember($member); $em->persist($car); $em->flush(); $carMembers= $car->getMembers(); echo count($carMembers); // --> show 1 echo get_class(carMembers[0]); // --> show MyCars\WSBundle\CarsController !!!
есть мои Существа:
Автомобиль
/** * @ORM\ManyToMany(targetEntity="Member", mappedBy="cars") */ private $members; /** * Remove Member * * @param MyCars\WSBundle\Entity\Member $member */ public function removeMember(\MyCars\WSBundle\Entity\Member $member) { $this->members->removeElement($member); $member->removeCar($this); }
как/** * @ORM\ManyToMany(targetEntity="Member", mappedBy="cars") */ private $members; /** * Remove Member * * @param MyCars\WSBundle\Entity\Member $member */ public function removeMember(\MyCars\WSBundle\Entity\Member $member) { $this->members->removeElement($member); $member->removeCar($this); }
член
/** * @ORM\ManyToMany(targetEntity="Car", cascade={"persist"}) * @ORM\JoinTable(name="cars_membres", * joinColumns={@ORM\JoinColumn(name="member_id", referencedColumnName="member_id")}, * inverseJoinColumns={@ORM\JoinColumn(name="car_id", referencedColumnName="car_id")} * ) */ private $cars;
Может ли кто-нибудь помочь?
Не забудьте инициализировать ArrayCollection в конструкторе класса, если вы хотите использовать функции add , contains или removeElement
<?php // ... use Doctrine\Common\Collections\ArrayCollection; class Car { /** * @MongoDB\Id */ protected $members; /** * General constructor */ public function __construct() { $this->members = new ArrayCollection(); } /** * @param Member $member * @return $this */ public function addMember(Member $member) { if (!$this->hasMember($member)) { $this->members->add($member); } return $this; } /** * @param Member $member * @return $this */ public function removeMember(Member $member) { if ($this->hasMember($member)) { $this->members->removeElement($member); } return $this; } /** * @return mixed */ public function getMembers() { return $this->tags; } /** * @param Member $member * @return mixed */ public function hasTag(Member $member) { return $this->members->contains($member); } }
Я думаю, что вы ищете orphanRemoval
отношения orphanRemoval
.
@ORM\ManyToMany(targetEntity="Car", cascade={"persist"}, orphanRemoval=true)
Поэтому, когда вы удаляете элемент из диспетчера сущности коллекции и флеша, он удаляет запись отношения из базы данных …
Какую коллекцию вы используете? Вы используете \ Doctrine \ ArrayCollecion? Вы уверены, что вы удаляете один экземпляр объекта-члена? Метод removeElement () удаляет объект из коллекции только в том случае, если он является одним и тем же экземпляром.
вот этот метод (обратите внимание на последний параметр (true) в методе array_search:
public function removeElement($element) { $key = array_search($element, $this->_elements, true); if ($key !== false) { unset($this->_elements[$key]); return true; } return false; }
сpublic function removeElement($element) { $key = array_search($element, $this->_elements, true); if ($key !== false) { unset($this->_elements[$key]); return true; } return false; }