在Doctrine 2中获取相关条目

时间:2011-02-08 00:01:34

标签: php database doctrine-orm

我已经决定熟悉一个ORM是一个很好的资产,并选择Doctrine 2作为首选的ORM。

我正在开展一个测试项目,以学习Doctrine的基础知识。虽然大多数人通常会使用博客,但我决定制作一个基本的应用程序,您可以在其中保存和跟踪订单。我的数据库架构如下:

User
    id
    name
Product
    id
    name
    price
Sales_order
    id
    user_id
    product_id
    quantity
    unit_price

因此,我的订单模型如下:

/**
 * @Entity
 * @Table(name="sales_order")
 */
class Order {

    /**
     * @Id
     * @Column(type="integer", nullable=false)
     * @GeneratedValue(strategy="AUTO")
     */
    private $Id;

    /**
     * @OneToOne(targetEntity="User", inversedBy="user")
     */
    private $user;

    /**
     * @OneToOne(targetEntity="Product", inversedBy="product")
     */
    private $product;

    /**
     * @Column(type="integer", nullable=false)
     */
    private $quantity;
}

现在,问题是,是否有一种从用户模型访问所有订单的简单方法?我应该为这些基本的东西编写DQL(学说查询语言)还是有办法轻松获得关联实体?我的意思是,除此之外没有任何意义,对吧?另外,我正确地做这些关联吗?我真的很困惑这个非常基本的模型...详细的帮助非常感谢。谢谢。

1 个答案:

答案 0 :(得分:2)

首先,不要过分担心数据库设计。您应该设计您的实体并使用SchemaTool

  

现在,问题是,是否有一种从用户模型访问所有订单的简单方法?

您的意思是从 用户模型访问所有订单,还是访问与 用户相关的所有订单?

如果你的意思是前者,那么你做错了(见下文)。如果您的意思是后者,则应在订单和用户之间设置bi-directional relationship。 (顺便说一下,OneToMany不是OneToOne,因为一个用户可能会有很多订单)。


  

我真的很困惑这个非常基本的模型......

我认为您遇到的问题 - 以及许多PHP程序员 - 是对DataMapper pattern以及最终领域驱动设计的基本理解。请记住,您正在处理可持久化对象,而不是数据库表。

我无法在此提供详细信息,因为我正在写一本书,因此我建议您阅读一本关于领域驱动设计的书籍,以帮助启动这些原则。有一些很好的在线资源可供使用,例如Federico Cargnelutti的一系列博客文章,但它们并非特定于Doctrine 2。