我正在尝试用 Doctrine 2完成一些简单的CRUD,但是当需要更新一个具有一个属性集作为数组集合的记录时,我似乎并没有像预期的那样可以使用removeElement()来工作。我什至尝试以这种可笑的丑陋的方式来做:

foreach($entity->getCountries() as $c) {
        $entity->getCountries()->removeElement($c);
        $this->em->persist($entity);
        $this->em->flush();
}

而且没有用...有人知道如何处理吗?我已经要求以多种不同的形式解决此问题,但到目前为止还没有得到很好的回应……似乎缺少关于 Doctrine 2 CRUD处理的良好示例。我将根据要求发布更多代码。

编辑
//in user entity
/**
 *
 * @param \Doctring\Common\Collections\Collection $property
 * @OneToMany(targetEntity="Countries",mappedBy="user", cascade={"persist", "remove"})
 */
private $countries;

//in countries entity
/**
 *
 * @var User
 * @ManyToOne(targetEntity="User", inversedBy="id")
 * @JoinColumns({
 *  @JoinColumn(name="user_id", referencedColumnName="id")
 * })
 */
private $user;

最佳答案

我在带有事件的项目中做类似的事情,这些事件的参与者与您的用户/国家/地区关系没有不同。我将对流程进行布局,然后您可以查看您是否在做其他不同的事情。

Participant实体上

/**
 * @ManyToOne(targetEntity="Event", inversedBy="participants", fetch="LAZY")
 * @JoinColumn(name="event_id", referencedColumnName="id", nullable="TRUE")
 * @var Event
 */
protected $event;

Event实体上:
/**
 * @OneToMany(targetEntity="Participant", mappedBy="event")
 * @var \Doctrine\Common\Collections\ArrayCollection
 */
protected $participants;

同样在Event#__constructor中,我这样初始化:
$this->participants = new \Doctrine\Common\Collections\ArrayCollection();

这是我如何更新事件:
public function update(Event $event, Event $changes)
{
    // Remove participants
    $removed = array();
    foreach($event->participants as $participant)
    {
        if(!$changes->isAttending($participant->person))
        {
            $removed[] = $participant;
        }
    }

    foreach($removed as $participant)
    {
        $event->removeParticipant($participant);
        $this->em->remove($participant);
    }

    // Add new participants
    foreach($changes->participants as $participant)
    {
        if(!$event->isAttending($participant->person))
        {
            $event->addParticipant($participant);
            $this->em->perist($participant);
        }
    }

    $event->copyFrom($changes);
    $event->setUpdated();
    $this->em->flush();
}
Event实体上的方法是:
public function removeParticipant(Participant $participant)
{
    $this->participants->removeElement($participant);
    $participant->unsetEvent();
}

public function addParticipant(Participant $participant)
{
    $participant->setEvent($this);
    $this->participants[] = $participant;
}
Participant实体上的方法是:
public function setEvent(Event $event)
{
    $this->event = $event;
}

public function unsetEvent()
{
    $this->event = null;
}

UPDATE :isAttending方法
/**
 * Checks if the given person is a
 * participant of the event
 *
 * @param Person $person
 * @return boolean
 */
public function isAttending(Person $person)
{
    foreach($this->participants as $participant)
    {
        if($participant->person->id == $person->id)
            return true;
    }

    return false;
}

关于doctrine - removeElement()和clear()在带有数组集合属性的 Doctrine 2中不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6462024/

10-13 01:59
查看更多