【问题标题】:Doctrine2 entity relationshipsDoctrine2 实体关系
【发布时间】:2011-12-29 12:09:13
【问题描述】:

我是 Symfony2 的新手(几年前使用过 symfony 1.x),我试图了解如何处理与 Doctrine2 的实体关系。 (顺便说一句,如果 Symfony2 书中有更多的关系示例而不是简单地参考 Doctrine2 文档,那就太好了 :-)

所以我有一个简单的产品实体,我想与多个类别相关联(即单个产品可以属于多个类别)。从表面上看,这看起来像是一对多的关系,但我认为这样的关系将通过数据库中的连接表来完成。所以我改为这样做:

class Product
{
  ....

  /**
   * @ORM\ManyToMany(targetEntity="Category");
   **/
  private $categories;

}

进行模式更新确实会按预期在数据库中创建连接表。但我想知道我是否错了将其改为多对多?我想我问的是最佳实践以及您将如何做到这一点?任何人都可以建议和/或提供示例吗?

【问题讨论】:

    标签: entity symfony doctrine-orm entity-relationship relationship


    【解决方案1】:

    您的句子“单个产品可以属于多个类别”是正确的,但这句话也是正确的:“多个产品可以属于多个类别”。那是因为你没有使用好的句子,它们是:

    • “一个类别可以有许多产品”
    • “一个产品可以有许多个类别”

    这意味着你有一个多对多的关系。

    如果是的话

    • “一个类别可以有许多产品”
    • “一个产品只能有一个类别”

    那么你就会有一对多和多对一的关系。

    【讨论】:

    • 感谢您的澄清 - 这是有道理的。
    【解决方案2】:

    如果您想要多对多关系,则需要一个中间表

    class Product
    {
        /**
         * @ManyToMany(targetEntity="Categories")
         * @JoinTable(name="Product_Category",
         *      joinColumns={@JoinColumn(name="product_id", referencedColumnName="id")},
         *      inverseJoinColumns={@JoinColumn(name="Category_id", referencedColumnName="id")}
         *      )
         */
        private $categories;
    }
    

    【讨论】:

    • 您不需要指定连接表或列,除非您不喜欢 Doctrine2 自动选择的(合理的)默认值。 (见doctrine-project.org/docs/orm/2.0/en/reference/…
    • 嗯,是的,但我认为更清楚地了解这种关系是如何形成的。 :)
    • 喜欢注释,但在阅读代码时会分散注意力:-)
    猜你喜欢
    • 2019-01-22
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 2014-10-26
    • 2014-01-11
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    相关资源
    最近更新 更多