我已经决定熟悉一个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(学说查询语言)还是有办法轻松获得关联实体?我的意思是,除此之外没有任何意义,对吧?另外,我正确地做这些关联吗?我真的很困惑这个非常基本的模型...详细的帮助非常感谢。谢谢。
答案 0 :(得分:2)
首先,不要过分担心数据库设计。您应该设计您的实体并使用SchemaTool。
现在,问题是,是否有一种从用户模型访问所有订单的简单方法?
您的意思是从 用户模型访问所有订单,还是访问与 用户相关的所有订单?
如果你的意思是前者,那么你做错了(见下文)。如果您的意思是后者,则应在订单和用户之间设置bi-directional relationship。 (顺便说一下,OneToMany不是OneToOne,因为一个用户可能会有很多订单)。
我真的很困惑这个非常基本的模型......
我认为您遇到的问题 - 以及许多PHP程序员 - 是对DataMapper pattern以及最终领域驱动设计的基本理解。请记住,您正在处理可持久化对象,而不是数据库表。
我无法在此提供详细信息,因为我正在写一本书,因此我建议您阅读一本关于领域驱动设计的书籍,以帮助启动这些原则。有一些很好的在线资源可供使用,例如Federico Cargnelutti的一系列博客文章,但它们并非特定于Doctrine 2。