Doctrine2: добавление существующей сущности к родителю, дублирование родителя

У меня есть два связанных класса (OneToMany):

<?php
class Container {
/**
* @var Content[]
* @\Doctrine\ORM\Mapping\OneToMany(targetEntity="Content", mappedBy="contents", cascade={"remove"})
*/
protected $contents;
}

class Content {
/**
* @var Container
* @\Doctrine\ORM\Mapping\ManyToOne(targetEntity="Container", inversedBy="contents", cascade={"persist"})
*/
public $container;
}

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

Я использую идентификатор родительского контейнера, как это:

<?php
$newContent->container = $repository->find($passedIdOfContainer);

// ...

$em->persist($newContent);
$em->flush();

Таким образом, в основном я просто получаю существующую запись объекта из базы данных (которая работает) и устанавливаю атрибут моего нового объекта содержимого с существующим объектом. Но теперь родитель (Контейнер) будет продублирован.

Когда я удаляю cascade={"persist"} Я получаю следующую ошибку:

Новый объект был найден с помощью отношения «Контент # Контейнер».
это не было настроено для каскадного сохранения операций для объекта:
Контейнер @ 0000 …

Что мне нужно сделать, чтобы создать нового потомка, со ссылкой на родителя, не дублируя родителя в базе данных?

0

Решение

use Doctrine\ORM\Mapping as ORM;

class Container
{
/**
* @var object
*
* @ORM\OneToMany(
*      targetEntity="Content",
*      mappedBy="container",
*      cascade={"persist", "remove"}
* )
*/
protected $contents;
}

use Doctrine\ORM\Mapping as ORM;

class Content
{
/**
* @var object
*
* @ORM\ManyToOne(
*      targetEntity="Container",
*      inversedBy="contents"* )
* @ORM\JoinColumn(
*      name="container_id",
*      referencedColumnName="id",
*      onDelete="CASCADE",
*      nullable=false
* )
*/
protected $container;
}

Предполагая, что у вас есть все методы, установленные в вашем Container файл сущности так:

//......
$container->addContents($contentObject);

$em->persist($container);
$em->flush();
0

Другие решения

Других решений пока нет …