Mysql Doctrin2和Symfony2:为什么cascade坚持不处理这种多对多关系?

Mysql Doctrin2和Symfony2:为什么cascade坚持不处理这种多对多关系?,mysql,symfony,doctrine-orm,many-to-many,cascade,Mysql,Symfony,Doctrine Orm,Many To Many,Cascade,在我的项目中,我得到了许多多对多实体。这个many-to-many关系有属性,所以我决定像这样把它们分成a1:nbn:1c 因此,我的简化类结构如下所示。到目前为止还不错,但当我运行控制器(也在下面列出)插入值时,我遇到了一个异常: 使用参数{…}执行“插入到b(…)值(…)”时发生异常 SQLSTATE[23000]:完整性约束冲突:1048列“class\u a\u id”不能为null 我做错了什么 甲级 C类 控制器 谢谢你考虑我的问题,但已经解决了! 只要在b中加上a类,这个问题就很容

在我的项目中,我得到了许多
多对多
实体。这个
many-to-many
关系有属性,所以我决定像这样把它们分成
a1:nbn:1c

因此,我的简化类结构如下所示。到目前为止还不错,但当我运行控制器(也在下面列出)插入值时,我遇到了一个异常:

使用参数{…}执行“插入到b(…)值(…)”时发生异常

SQLSTATE[23000]:完整性约束冲突:1048列“class\u a\u id”不能为null

我做错了什么

甲级 C类 控制器
谢谢你考虑我的问题,但已经解决了! 只要在b中加上a类,这个问题就很容易解决。所以我的控制器现在可以工作了。请参见下面的差异:

控制器
我不是100%确定,但问题可能是在添加classB之前,ClassA对象不是托管对象。只是在黑暗中拍摄,但如果你在foreach循环之前坚持$a,会发生什么?@KenHannel谢谢你的帮助!解决了我的问题。你可以在我下面的答案中看到。是的,这是一个简单的解决方法。这基本上就是我在级联操作中所期望的行为。如果要在所有代码中使用此修复程序,我建议从ORM定义中删除级联。我们遇到了一个问题,在这个问题上我们得到了意外的行为,我们最终跟踪到了一个从未被删除的级联定义。@KenHannel感谢您的提示。我将证明这是我的项目:)
<?
/**
 * @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;
}
/**
 * @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 **/
}
/**
 * @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();
$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();