学说"通过关系找到了一个新的实体"错误

Rez*_*a S 10 doctrine symfony doctrine-orm

首先,我想说我已经阅读了所有文档,并在发布此问题之前搜索了这些内容.我知道那个错误意味着什么(关系中的非持久化实体)

我收到这个错误,我认为我不应该得到它.

我有一个OneToMany双向关系如下:

Class Channel
{
    /** 
    * @ORM\OneToMany(targetEntity="Step", mappedBy="channel", cascade={"all"}, orphanRemoval=true)
    * @ORM\OrderBy({"sequence" = "ASC"})
    */
    protected $steps;
}

Class Step
{
    /** 
    * @ORM\ManyToOne(targetEntity="Channel", inversedBy="steps")
    */
    protected $channel;
}
Run Code Online (Sandbox Code Playgroud)

一个人Channel可以拥有许多人Step,拥有者也可以Channel.从Doctrine 2.4升级到2.5后,我收到此错误:

Doctrine\ORM\ORMInvalidArgumentException:通过关系'Company\MyBundle\Entity\Step#channel'找到一个新实体,该关系未配置为级联实体的持久操作

为什么它甚至从反面寻找新的关系呢?这是我的代码:

$channel = new Channel();
$step = new Step();
$channel->addStep($step);
$em->persist($channel);
$em->flush();
Run Code Online (Sandbox Code Playgroud)

谢谢!

Don*_*sto 9

你是对的:学说只是为了改变自己的一方,但你错了:拥有你们关系的一面是Step,不是Channel.

为什么步入拥有方?因为是具有外键的实体.即使是Doctrine文档也告诉你

拥有方必须使用OneToOne,ManyToOne或ManyToMany映射声明的inversedBy属性.inversedBy属性包含反面的关联字段的名称.

可能的解决方案:

  • 尝试通过放入cascade={"all"}Step实体来反转级联操作(你确定所有这些都是正确的选择吗?)

  • 明确地坚持两个实体:

    $channel = new Channel();
    $step = new Step();
    $channel->addStep($step);
    $em->persist($channel);
    $em->persist($step);
    $em->flush();
    
    Run Code Online (Sandbox Code Playgroud)

    在这里你可以阅读为什么这里提供的第二种方式也很好