这两个学说映射的真正区别是什么?

时间:2012-05-11 13:42:47

标签: database-design orm doctrine doctrine-orm associations

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 个答案:

答案 0 :(得分:0)

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

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

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