2

AProduct可能有零个或多个Label。ALabel可以分配为零或多个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)文档示例

/**
 * @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;
}
4

1 回答 1

0

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

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

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

于 2012-05-21T15:28:49.707 回答