多对多的学说和独特实体可能吗?

时间:2018-03-24 23:21:34

标签: doctrine-orm doctrine

我有两个班级AB,涉及多对多。

A类看起来像这样:

/** @ORM\Entity **/
class A {
    /** @ORM\ManyToMany(targetEntity="B", cascade={"all"}) **/
    public $x;
}

该学说将创建一个包含A_BAId列的粘合BId表。

是否可以使BId列唯一,即。两个B实体中没有A个实体?

2 个答案:

答案 0 :(得分:2)

您所描述的是单向一对多关联。要进行设置,您需要使用JoinTable注释来强制执行一对多基数,如in this section of the documentation所述。

对于您的AB实体,它将类似于:

/** @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实体。