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



我有两个类AB多对多的关系。

类 A 如下所示:

/** @ORMEntity **/
class A {
    /** @ORMManyToMany(targetEntity="B", cascade={"all"}) **/
    public $x;
}

该学说将创建一个带有AId列和BId列的胶水A_B表。

是否可以使BId列唯一,即两个A实体不会有B实体?

您描述的是单向一对多关联。若要设置它,需要使用 JoinTable 注释来强制执行一对多基数,如文档的本节中所述。

对于您的AB实体,它将如下所示:

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

相关内容

  • 没有找到相关文章