У меня есть два связанных класса (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 …
Что мне нужно сделать, чтобы создать нового потомка, со ссылкой на родителя, не дублируя родителя в базе данных?
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();
Других решений пока нет …