【问题标题】:Doctrine "A new entity was found through the relationship" error教义“通过关系发现了一个新实体”错误
【发布时间】:2015-08-08 21:48:52
【问题描述】:

首先我想说的是,在发布这个问题之前,我已经阅读了所有文档并在谷歌上搜索了很多内容。我知道那个错误是什么意思(关系中的非持久实体)

在我认为不应该出现的地方出现了这个错误。

我有一个 OneToMany Bi-Directional 关系如下:

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;
}

一个Channel 可以有多个Steps,拥有方是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();

谢谢!

【问题讨论】:

  • Channel::addStep() 长什么样子?
  • 您没有在 Step 实体上指定连接列。所以 Doctrine 不知道如何保存它。
  • 如果一个 Channel 可以有多个 Steps,那么我认为拥有方是 Step 实体,而不是 Channel 实体

标签: symfony doctrine-orm doctrine


【解决方案1】:

你是对的:Doctrine 只关注拥有方的变化,但你错了:你们关系的拥有方是Step,而不是Channel。

为什么 step 是拥有方?因为是具有外键的实体。甚至 Doctrine 文档也会告诉你

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

可能的解决方案:

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

  • 显式持久化两个实体:

    $channel = new Channel();
    $step = new Step();
    $channel->addStep($step);
    $em->persist($channel);
    $em->persist($step);
    $em->flush();
    

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

【讨论】:

  • 谢谢,我将 cascade 移至 Step 实体,这很有帮助!当您想要级联关系时,您何时不想拥有all?
  • 我可以在关系的双方都有级联吗?因为大部分时间我都在通过频道
  • @RezaS 全部表示每个级联操作(persist、REMOVE 等)所以,也许,有时你不想删除一个通道,如果你删除一个步骤(只是举个例子)当然你可以在两边都使用级联操作,但这取决于你自己的逻辑。
【解决方案2】:

你试图坚持$channel,但它里面有Step实体。所以在 Doctrine 现在你有 2 个实体排队等待插入。然后 Doctrine 命令实体按照第一个是 Step 的顺序排列,因为它有 channel_id 外键(现在是空的)。 Doctrine 尝试持久化该实体,当它了解 channel_id 为空时,它会看到用于持久化的级联规则。它看不到任何级联规则并抛出此异常。

【讨论】:

  • 不,这里的外键是由通道持有的,而不是相反的(拥有方是持有外键的一方,这里拥有方是通道)
  • 在数据库中,Step 表中将有列 channel_id,因为您有关系 One Channel - To - 很多 Steps
  • 是的,你是对的,我没有看到文件名并感到困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多