通过传递arraycollection更新实体OneToMany关系

时间:2018-11-02 09:33:49

标签: php symfony doctrine-orm

我正在尝试通过使用方法将$ linhas的旧数组替换为新数组 setLinhas(Arraycollection $ linhas) 但是当它进行更改时会发生什么,就是他在内部用新行创建了一个新对象,而不用新行更新了旧对象。它创建一个具有与旧对象相同值的新实例。假定要更新同一对象而不创建新对象!

实体的财产:

/**
 * @var ArrayCollection
 *
 * @ORM\OneToMany(targetEntity="AppBundle\Entity\LinhasPrecos", mappedBy="preco",orphanRemoval=true,cascade={"persist","merge"})
 */
protected $linhas;

 /**
 * @param $linhas
 */
public function setLinhas($linhas)
{
    $this->linhas = new ArrayCollection($linhas);
}

在服务中

$oldObject->setLinhas($newObectWithNewLinhas->getLinhas());
$this->em->persist($oldObject);

但是如果我手动进行更改,它将起作用:

$oldLinhas = $oldObject->getLinhas()->getValues();

                        foreach($oldLinhas as $oldLinha)
                        {
                            $oldObject->removeLinha($oldLinha);
                        }

                        $linhaToCopy = $newObectWithNewLinhas->getLinhas()->getValues();

                        foreach($linhasCopyNew as $linhaCopyNew)
                        {
                            $oldObject->addLinha($linhaCopyNew);
                        }

提前谢谢!

1 个答案:

答案 0 :(得分:1)

您做错了!

改为使用此构造函数和setter:

Preco

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Preco
{
    //...

    /**
     * @var Collection
     *
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\LinhasPrecos", mappedBy="preco", orphanRemoval=true, cascade={"persist","merge"})
     */
    protected $linhas;

    //...

    public function __construct()
    {
        $this->linhas = new ArrayCollection();
    }

    public function setLinhas($linhas)
    {
        $this->linhas = $linhas;
    }
}

通知

  • 您应将学说集传递到setLinhas中。

  • 这样,您将用新集合完全替换旧集合(而不是向旧集合中添加元素)。