这两个 Doctrine 映射的真正区别是啥?

Posted

技术标签:

【中文标题】这两个 Doctrine 映射的真正区别是啥?【英文标题】:What's really the difference in these two Doctrine mappings?这两个 Doctrine 映射的真正区别是什么? 【发布时间】:2012-05-11 13:42:46 【问题描述】:

Product 可能有零个或多个 LabelLabel 可以分配给零个或多个 Product。那么,Doctrine中映射A映射B有什么区别呢?

映射 A (OneToMany - ManyToOne)

/**
 * @ORM\Entity
 * @ORM\Table(name="product")
 */
class Product

    /**
     * @ORM\OneToMany(targetEntity="Label", mappedBy="products")
     */
    protected $labels;


/**
 * @ORM\Entity
 * @ORM\Table(name="label")
 */
class Label

    /**
     * @ORM\ManyToMany(targetEntity="Product", inversedBy="labels")
     */
    protected $products;

映射 B (ManyToMany - ManyToMany) documentation example

/**
 * @ORM\Entity
 * @ORM\Table(name="product")
 */
class Product

    /**
     * @ORM\ManyToMany(targetEntity="Label", mappedBy="products")
     */
    protected $labels;


/**
 * @ORM\Entity
 * @ORM\Table(name="label")
 */
class Label

    /**
     * @ORM\ManyToMany(targetEntity="Product", inversedBy="labels")
     */
    protected $products;

【问题讨论】:

【参考方案1】:

您的第一个示例尝试将 ONE-TO-MANY 关系与 MANY-TO-MANY 关系匹配。这将在尝试访问产品标签时引起问题。它将尝试在标签表的列中查找关系。而多对多关系应该有一个额外的表来耦合两个实体。

这纯粹是理论上的。我没有用真实的代码尝试过,但我想如果你使用第一个例子,Doctrine 会抛出异常。我实际上不应该使用第一个示例。

如果您不熟悉不同类型的关系,请阅读一些有关 RDBMS 的文章: http://en.wikipedia.org/wiki/Relational_model

【讨论】:

以上是关于这两个 Doctrine 映射的真正区别是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 Symfony2 中使用 Doctrine 映射异常错误

DOMContentLoaded 与 window.onload。这两者之间的真正区别是啥? [复制]

Doctrine 2.1 @Column 注释中“选项”的语法是啥?

Doctrine ODM with MongoDB 需要两个参考映射集

如何用学说映射简单的数据库

Doctrine映射和PostgreSQL模式