Php 原则2:插入与多个关系:未插入引用行

Php 原则2:插入与多个关系:未插入引用行,php,mysql,doctrine-orm,Php,Mysql,Doctrine Orm,我有两个实体A和B,其中A有许多B(从A到B的单向多对多)。 创建新a并向其分配B时,联接表上的约束失败,因为条令试图为新a插入ID为0的关联。这使我相信,当时没有执行新a的插入 /** * @Entity * @Table(name="a") */ class A { /** * @var int * @Id @Column(type="integer") @GeneratedValue */ protected $id; /**

我有两个实体A和B,其中A有许多B(从A到B的单向多对多)。 创建新a并向其分配B时,联接表上的约束失败,因为条令试图为新a插入ID为
0
的关联。这使我相信,当时没有执行新a的插入

/**
 * @Entity
 * @Table(name="a")
 */
class A {
    /**
     * @var int
     * @Id @Column(type="integer") @GeneratedValue
     */
    protected $id;
    /**
     * @var B[]
     * @ManyToMany(targetEntity="B", fetch="LAZY")
     * @JoinTable(name="jointable",
     *     joinColumns={@JoinColumn(name="a_id", referencedColumnName="id")},
     *     inverseJoinColumns={@JoinColumn(name="b_id", referencedColumnName="id")}
     * )
     */
    protected $bs;

    public function getBs() { return $this->bs; }
}

// I omit B here, because it is not important

// controller code:
$a = new A();
$a->getBs()->add($em->find(B::class, 8));
$em->persist($a);
$em->flush();
这就是我得到的错误:

An exception occurred while executing 'INSERT INTO jointable (a_id, b_id) VALUES (?, ?)' with params [0, 8]:

SQLSTATE[23000]: Integrity constraint violation...
查看数据库(和查询日志),永远不会创建A。结果,与B#8的关联失败


我怎样才能使条令正确呢?

事实证明条令做的一切都是正确的。问题是我报告的PHP错误:

为了用条令来补偿,您有两种选择:

重写布尔类型 如果数据库中的所有布尔字段都是tinyint(对我来说也是如此),则可以简单地重写布尔类型:

Type::overrideType(Type::BOOLEAN,    \Doctrine\DBAL\Types\TinyintBooleanType::class);
为TINYINT布尔值添加自定义类型 如果数据库中并非所有布尔字段都是Tinits,则必须向其添加新类型:

Type::addType(
    \Doctrine\DBAL\Types\TinyintBooleanType::NAME,
    \Doctrine\DBAL\Types\TinyintBooleanType::class
);

$entityManager->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping(
    Type::SMALLINT, \Doctrine\DBAL\Types\TinyintBooleanType::NAME
);  
然后,您可以在实体中使用此类型,如下所示:

@Column(type="tinyintasbool")
TinyintBooleanType的来源
事实证明,条令做的一切都是正确的。问题是我报告的PHP错误:

为了用条令来补偿,您有两种选择:

重写布尔类型 如果数据库中的所有布尔字段都是tinyint(对我来说也是如此),则可以简单地重写布尔类型:

Type::overrideType(Type::BOOLEAN,    \Doctrine\DBAL\Types\TinyintBooleanType::class);
为TINYINT布尔值添加自定义类型 如果数据库中并非所有布尔字段都是Tinits,则必须向其添加新类型:

Type::addType(
    \Doctrine\DBAL\Types\TinyintBooleanType::NAME,
    \Doctrine\DBAL\Types\TinyintBooleanType::class
);

$entityManager->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping(
    Type::SMALLINT, \Doctrine\DBAL\Types\TinyintBooleanType::NAME
);  
然后,您可以在实体中使用此类型,如下所示:

@Column(type="tinyintasbool")
TinyintBooleanType的来源