如何设置正确的Doctrine级联关系?

时间:2018-02-12 10:59:06

标签: php symfony doctrine sonata-admin

我有一个旧的Page实体和一个新的Equivalent实体。我的Page.orm.xml现在已经过编辑,包含以下内容:

    <one-to-many target-entity="AppBundle\Entity\Equivalent" field="equivalents">
        <cascade>
            <cascade-all/>
        </cascade>
    </one-to-many>

...我的PageAdmin课程已经过编辑,包括以下内容:

            ->add('equivalents', 'sonata_type_collection', array(
                'label' => "Equivalents",
                'cascade_validation' => true,
                'required' => false,
            ), array(
                'edit' => 'inline',
                'inline' => 'table',
                'targetEntity' => 'AppBundle\Entity\Equivalent',
            ))

...我的等效实体定义包括以下内容:

/**
 * @var \Application\Sonata\PageBundle\Entity\Page
 * @ORM\ManyToOne(targetEntity="Application\Sonata\PageBundle\Entity\Page", cascade={"persist"})
 */
private $page;

到目前为止一切顺利。当我编辑页面时,我得到一个光滑的界面,允许我以内联形式添加和编辑新的等效记录。非常好。

当我尝试保存Page实体时出现问题。我收到以下错误:

  

通过这种关系找到了一个新的实体   &#39;应用程序\奏\ PageBundle \实体\页#当量&#39;那不是   配置为级联实体的持久化操作:一些等效的。   解决此问题:显式调用EntityManager#persist()on   这个未知的实体或配置级联持久存在此关联   映射例如@ManyToOne(..,cascade = {&#34; persist&#34;})。

我做错了什么?我现有的级联定义是否不应涵盖此行为?我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:1)

关联字段缺少定义。将映射添加到:

<one-to-many target-entity="AppBundle\Entity\Equivalent" field="equivalents" mapped-by="page">
    <cascade>
        <cascade-all/>
    </cascade>
</one-to-many>

反转到:

/**
 * @var \Application\Sonata\PageBundle\Entity\Page
 * @ORM\ManyToOne(targetEntity="Application\Sonata\PageBundle\Entity\Page", inversedBy="equivalents", cascade={"persist"})
*/
private $page;