我有两个班级A
和B
,涉及多对多。
A类看起来像这样:
/** @ORM\Entity **/
class A {
/** @ORM\ManyToMany(targetEntity="B", cascade={"all"}) **/
public $x;
}
该学说将创建一个包含A_B
和AId
列的粘合BId
表。
是否可以使BId
列唯一,即。两个B
实体中没有A
个实体?
答案 0 :(得分:2)
您所描述的是单向一对多关联。要进行设置,您需要使用JoinTable
注释来强制执行一对多基数,如in this section of the documentation所述。
对于您的A
和B
实体,它将类似于:
/** @ORM\Entity **/
class A
{
/* ... other attributes ... */
/**
* @ORM\ManyToMany(targetEntity="B")
* @ORM\JoinTable(inverseJoinColumns={@ORM\JoinColumn(unique=true, onDelete="CASCADE")})
*/
public $bs;
}
我保留了适用于unique
列的b_id
选项,因为无论如何都会自动为您生成其他选项,例如列和表名。我添加了onDelete="CASCADE"
,因为它应该是您在关联表中需要的默认行为。
通过此关联,doctrine将输出以下模式:
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所拥有的双向OneToMany
关联并在A中反转就可以,因为它会在{{1}上添加外键表格引用了A,因此也强制执行正确的基数。
答案 1 :(得分:0)
所以你想要:
一个B实体只与一个A实体相关,但一个A实体可以与许多不同的B实体相关。
这可以通过将OneToMany的关系从A转换为B来实现:
\' {
if(sb.length() > 1 ){
yybegin(YYINITIAL);
throw new RuntimeException("you can not instatiate a char variable with more than one characters\n");
}else{
yybegin(YYINITIAL);
out.println("char:" + sb.toString());
}
并在实体B中:
class A {
/**
* @ORM\OneToMany(targetEntity="B", mappedBy="a", cascade={"all"})
**/
public $x;
}
这样,每个B实体都将是“唯一的”,因为在A实体的表上创建了与A的id的外键关系。
不要被名称“OneToMany”混淆,2个B实体不能在2个A实体之间共享,这将是ManyToMany。每个B实体只属于一个A实体。