我有两个相关的类(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;
}
现在,当我添加一个新的Content项时,Container将在数据库中重复,新的Content项链接到副本。
我使用父容器的id,如下所示:
<?php
$newContent->container = $repository->find($passedIdOfContainer);
// ...
$em->persist($newContent);
$em->flush();
所以基本上我只是从数据库中获取现有的实体记录(可以工作),并使用现有对象设置我的新内容对象的属性。但现在父(Container)将被复制。
当我删除cascade={"persist"}
时,我收到以下错误:
通过“Content#Container”关系找到了一个新实体 未配置为级联实体的持久操作: 容器@ 0000 ...
我需要做什么,创建新的子节点,引用父节点,而不重复数据库中的父节点?
答案 0 :(得分: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();