我有两个类A
和B
多对多的关系。
类 A 如下所示:
/** @ORMEntity **/
class A {
/** @ORMManyToMany(targetEntity="B", cascade={"all"}) **/
public $x;
}
该学说将创建一个带有AId
列和BId
列的胶水A_B
表。
是否可以使BId
列唯一,即两个A
实体不会有B
实体?
您描述的是单向一对多关联。若要设置它,需要使用 JoinTable
注释来强制执行一对多基数,如文档的本节中所述。
对于您的A
和B
实体,它将如下所示:
/** @ORMEntity **/
class A
{
/* ... other attributes ... */
/**
* @ORMManyToMany(targetEntity="B")
* @ORMJoinTable(inverseJoinColumns={@ORMJoinColumn(unique=true, onDelete="CASCADE")})
*/
public $bs;
}
我只是保留了适用于b_id
列的unique
选项,因为无论如何都会为您自动生成其他选项,例如列和表名称。我添加了onDelete="CASCADE"
因为它应该是您希望在关联表中默认的行为。
通过此关联,原则将输出以下架构:
CREATE TABLE a_b (a_id INT NOT NULL, b_id INT NOT NULL, INDEX IDX_28CB39EA3BDE5358 (a_id), UNIQUE INDEX UNIQ_28CB39EA296BFCB6 (b_id), PRIMARY KEY(a_id, b_id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
ALTER TABLE a_b ADD CONSTRAINT FK_28CB39EA3BDE5358 FOREIGN KEY (a_id) REFERENCES a (id) ON DELETE CASCADE;
ALTER TABLE a_b ADD CONSTRAINT FK_28CB39EA296BFCB6 FOREIGN KEY (b_id) REFERENCES b (id) ON DELETE CASCADE;
附带说明一下,如果 B 拥有关联并不重要,只需让 B 拥有并在 A 中反转的双向OneToMany
关联就可以了,因为它会在 B
的表上添加一个引用 A 的外键,从而也强制执行正确的基数。
你想要:
一个 B 实体仅与一个 A 实体相关,但一个 A 实体可以与许多不同的 B 实体相关。
这可以通过将与OneToMany的关系从A到B来完成:
class A {
/**
* @ORMOneToMany(targetEntity="B", mappedBy="a", cascade={"all"})
**/
public $x;
}
在实体 B 中:
class B {
/**
* @ORMManyToOne(targetEntity="A", inversedBy="x")
**/
public $a;
}
这样,每个 B 实体将是"唯一的",因为在 B 实体的表上创建了与 A 的 id 的前键关系。
不要被名称"OneToMany"混淆,2 个 B 实体不能在 2 个 A 实体之间共享,那就是 ManyToMany。每个 B 实体将仅属于一个 A 实体。