Doctrine2:将现有实体添加到父实体,复制父实体

时间:2015-05-25 17:35:03

标签: php doctrine-orm cascade

我有两个相关的类(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 ...

我需要做什么,创建新的子节点,引用父节点,而不重复数据库中的父节点?

1 个答案:

答案 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();