Обновление отношения Entity OneToMany путем передачи arraycollection - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь изменить старый набор массива $ 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 голосов
/ 03 ноября 2018

Вы делаете это неправильно!

используйте вместо этого этот конструктор и установщик:

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.

  • Таким образом, вы полностью заменяете старую коллекцию новой (не добавляя элемент в старую коллекцию).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...