Php 原则2:插入与多个关系:未插入引用行
我有两个实体A和B,其中A有许多B(从A到B的单向多对多)。 创建新a并向其分配B时,联接表上的约束失败,因为条令试图为新a插入ID为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; /**
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的来源