我正在尝试通过使用方法将$ 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);
}
提前谢谢!
答案 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
中。
这样,您将用新集合完全替换旧集合(而不是向旧集合中添加元素)。