我可以使用Doctrine2并且它可以工作。但我真的不明白我在做什么..
我不明白什么是代理,我从命令行创建了em,但我真的需要它们吗?
Doctrine2注释如何工作? Doctrne2文件是否每次都扫描以从实体注释中查找存储库类文件?
我认为我需要一些资源来理解ORM的基本概念。 项目正在运作,但我不确定它是否正常运作..
由于
答案 0 :(得分:7)
好的,首先要明白的是,您的数据库表和关系已“映射”到您的php“实体”。例如,您可能有一个用户表。然后,您将拥有一个代表用户实体的php类。在此类中,是受保护/私有成员变量,表示用户表中的值以及与其他实体的关系。
Doctrine从映射文件中获取映射信息。这些可能是实体本身,其中映射信息在实体类中表示为注释(注释)。您也可以使用YAML或XML将映射信息与实体类完全分开。
一旦您配置了实体类和映射信息并准备好了,Doctrine就会在后台生成“代理”类。您不必创建这些,因为您可以配置D2为您自动创建它们。代理类通过继承提供对实体的访问,并且是Doctrine 2的必需部分,没有它们,您无法访问实体数据。
要记住的另一件事是工作单位。当你从数据库中获得一个实体时,比如一个用户,工作单元(uow)在内部持有对它的引用。如果你随后对实体进行了更改并持久化并刷新它,那么uow会计算它从db获得的那个与它返回的那个之间的差异,并计算完成作业所需的sql。
首先使用D2可能会令人生畏,因为它是对第一个版本的完全重写,并且有许多新的设计模式需要理解所以不要担心如果你现在不确定它,继续工作用它,它最终会开始点击。
修改强>
要回答您的第二个问题,是Doctrine会在每个请求中扫描您的映射信息。这显然会减慢执行速度。但是,在生产中,您将使用其中一个驱动程序(ApcCache,MemcachCache等)启用元数据缓存。这不会成为一个问题。值得指出的是,D2支持3种类型的缓存,元数据,查询(DQL转换)和结果(数据库结果缓存)。所有都可配置不同的缓存驱动程序。
答案 1 :(得分:0)