Doctrine removeElement()和clear()不';t使用数组集合属性在原则2中工作

Doctrine removeElement()和clear()不';t使用数组集合属性在原则2中工作,doctrine,doctrine-orm,Doctrine,Doctrine Orm,我试图用条令2完成一些简单的CRUD,但当需要更新一个记录,其中一个属性集是数组集合时,我似乎没有让removeElement()按预期工作。我甚至试着用这种可笑的丑陋方式来做: foreach($entity->getCountries() as $c) { $entity->getCountries()->removeElement($c); $this->em->persist($entity); $this-&

我试图用条令2完成一些简单的CRUD,但当需要更新一个记录,其中一个属性集是数组集合时,我似乎没有让removeElement()按预期工作。我甚至试着用这种可笑的丑陋方式来做:

foreach($entity->getCountries() as $c) {
        $entity->getCountries()->removeElement($c);
        $this->em->persist($entity);
        $this->em->flush();
}
但它不起作用。。。有人知道怎么处理吗?我已经以许多不同的形式要求解决这个问题,到目前为止还没有得到很好的回应。。。似乎缺少理论2积垢处理的好例子。我会根据要求发布更多代码

编辑

//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;

新答案

在您所在的国家/地区,您是否应该:

@ManyToOne(targetEntity="User", inversedBy="countries") 
而不是倒过来的=“id”

初始答案

您需要将实体中的“国家”字段设置为“删除级联”。例如,在双向一对多关系上:

class Entity
{
    /**
     * 
     * @OneToMany(targetEntity="Country", mappedBy="entity", cascade={"remove"})
     */
    private $countries;
}
这样,在保存实体时,条令还将保存附加到实体(例如国家)的集合中的更改。否则,您必须在刷新前明确删除要删除的国家/地区,例如

$this->em()->remove($aCountry);

这也适用于持久化、合并和分离操作。更多信息

我在一个项目中做了类似的事情,其中的参与者与您的用户/国家关系没有什么不同。我会列出流程,你可以看看是否有什么不同之处

参与者
实体上

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

/**
 * @OneToMany(targetEntity="Participant", mappedBy="event")
 * @var \Doctrine\Common\Collections\ArrayCollection
 */
protected $participants;
同样在
事件#u___
构造函数中,我初始化如下:

$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();
}
事件
实体上的方法有:

public function removeParticipant(Participant $participant)
{
    $this->participants->removeElement($participant);
    $participant->unsetEvent();
}

public function addParticipant(Participant $participant)
{
    $participant->setEvent($this);
    $this->participants[] = $participant;
}
public function setEvent(Event $event)
{
    $this->event = $event;
}

public function unsetEvent()
{
    $this->event = null;
}
参与者
实体的方法有:

public function removeParticipant(Participant $participant)
{
    $this->participants->removeElement($participant);
    $participant->unsetEvent();
}

public function addParticipant(Participant $participant)
{
    $participant->setEvent($this);
    $this->participants[] = $participant;
}
public function setEvent(Event $event)
{
    $this->event = $event;
}

public function unsetEvent()
{
    $this->event = null;
}
更新: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;
}

@faken检查编辑,它已经按照您的建议设置好了,但是不起作用。@faken我也试过了,但我仍然没有删除这些该死的国家/地区。我想您必须在对实体进行这些更改后重新创建或更新架构。是你干的吗?(注意不要只是“更新”模式,它通常会破坏数据库;删除表并重新创建可能更好)是的,我也这么做了。这是一个相当漫长和令人沮丧的一天,所有本该起作用的事情都没有起作用。你有任何CRUD的例子,其中有一个更新的记录与一个单一的关系?我还没有在网上找到什么好东西。你到底想达到什么目的?你想把所有的国家都除掉吗?或者你是在试图删除一个国家?你读过文档中关于与协会合作的部分吗:是的@rojoca我已经读过了。我正试图删除与一个用户实体关联的所有国家,这样我就可以为更多不同的国家更改它们。我正在根据我的项目进行调整。一个简单的问题。。。我正在向我的更新函数传递一个数组(实际上是$\u POST)。如何设置事件和位置,以便将其作为对象传递?我想这对教义来说更“健康”,对吧?有没有一种方法可以“自动”向对象提供数组?我会避免从$\u POST创建“自动”对象。我这样做的原因是事件输入很复杂,需要大量验证。我有一个类(工厂),它接受一个数组(例如,
$\u POST
)并创建一个
事件
对象。一旦我验证了这个对象,如果它是“新的”,我就可以保存它,或者使用它来更新一个现有的事件,如上所述。如果您的输入很简单并且只需要简单的验证,那么您不需要走到这个极端。只要确保您始终验证输入。有了您的帮助和示例,我就能够克服条令2的最大问题,我真的被这个问题困住了,现在我的代码看起来更漂亮了。谢谢!