【问题标题】:Doctrine2 with Symfony2: Why does cascade persist not work on this many-to-many relationship?带有 Symfony2 的 Doctrine2:为什么级联持续在这种多对多关系上不起作用?
【发布时间】:2013-03-15 22:53:45
【问题描述】:

在我的项目中,我得到了许多 many-to-many 实体。这个many-to-many 关系具有属性,所以我决定将它们拆分为A 1:n B n:1 C,就像is described in this post 一样。

所以我的简化类结构如下所示。到目前为止一切顺利,但是当我运行我的控制器(也在下面列出)来插入值时,我遇到了一个异常:

使用参数 {...} 执行“INSERT INTO b (...) VALUES (...)”时发生异常

SQLSTATE[23000]:违反完整性约束:1048 列 'class_a_id' 不能为空

我做错了什么?

A 类

<?
/**
 * @ORM\Entity
 * @ORM\Table(name="a")
 */
class ClassA {
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     **/
    protected $id;

    /** OTHER FIELDS **/

    /**
     * @ORM\OneToMany(targetEntity="ClassB", mappedBy="class_a", cascade={"persist", "remove"})
     **/
    protected $class_b;
}

B 类

/**
 * @ORM\Entity
 * @ORM\Table(name="b")
 */
class ClassB {
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     **/
    protected $id;
    /**
     * @ORM\ManyToOne(targetEntity="ClassC", inversedBy="class_b")
     * @ORM\JoinColumn(name="class_c_id", referencedColumnName="id", nullable=false)
     **/
    protected $class_c;
    /**
     * @ORM\ManyToOne(targetEntity="ClassA", inversedBy="class_b")
     * @ORM\JoinColumn(name="class_a_id", referencedColumnName="id", nullable=false)
     **/
     protected $class_a;

    /** OTHER FIELDS **/
}

C 类

/**
 * @ORM\Entity
 * @ORM\Table(name="c")
 */
class ClassC {
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /** OTHER FIELDS **/

    /**
     * @ORM\OneToMany(targetEntity="ClassB", mappedBy="class_c")
     **/
    protected $class_b;
}

控制器

$em = $this->getDoctrine()->getEntityManager();
$a = new ClassA();
$a->setXXX() //Setting some other fields
foreach(...) {
    $b = new ClassB();
    $b->setClass_C(...); //found by doctrine out of database and set into classB
    $b->setXXX() //Setting some other fields
    $a->addClass-B($b); //added ClassB into ClassA
}
$em->persist($a);
$em->flush();

【问题讨论】:

  • 我不是 100% 确定,但看起来问题可能是 ClassA 对象在您将 classB 添加到它之前不是托管对象。只是在黑暗中拍摄,但如果你在 foreach 循环之前坚持 $a,会发生什么?
  • @KenHannel 感谢您的帮助!解决了我的问题。您可以在下面的答案中看到它。

标签: mysql symfony doctrine-orm many-to-many cascade


【解决方案1】:

感谢您考虑我的问题,但已经解决了! 只需将 a 类添加到 b 中即可轻松解决该问题。所以我的控制器现在可以工作了。看看下面的区别:

控制器

$em = $this->getDoctrine()->getEntityManager();
$a = new ClassA();
$a->setXXX() //Setting some other fields
foreach(...) {
    $b = new ClassB();
    $b->setClass_C(...); //found by doctrine out of database and set into classB
    $b->setXXX() //Setting some other fields
    $a->addClass-B($b); //added ClassB into ClassA
    $b->setClass_A($a); //add ClassA into Class B !!NEW!!
}
$em->persist($a);
$em->flush();

【讨论】:

  • 是的,这是修复它的简单方法。这基本上是我在级联操作中所期望的确切行为。如果您要在所有代码中使用此修复程序,那么我建议您从 ORM 定义中删除级联。我们遇到了一个问题,我们遇到了意外行为,我们最终将其追踪到从未删除的级联定义。
  • @KenHannel 感谢您的提示。我会证明这是我的项目:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
相关资源
最近更新 更多