ORM是全盘接受还是可以部分使用?

8
如果我使用Zend或Symfony等ORM,是全部还是部分应用呢?
我想使用ORM,但有时也想优化性能并自己编写查询来深入了解。因此,如果我开始使用ORM,一旦将其包含在我的项目中,是否很难回到以前的方式?

2
根据ORM而定,例如NHibernate支持命名查询。 - Roman
你考虑了哪些ORM框架? - p.campbell
3个回答

9

你考虑了哪些ORM? 我现在至少正在考虑propel和doctrine。 - jblue
Zend具有抓取数据库句柄并直接向数据库发送原始查询的能力。在我看来,将所有数据库访问代码放入模型类中以便以后查找和更新比纯粹坚持ORM更重要。 - Matt Wheeler

6
使用Doctrine可以相对容易地“打破”ORM。Doctrine提供4种不同的查询方式:
- DQL。Doctrine自己的查询语言,具有所有Doctrine的优点。 - “原始”的DQL(Doctrine2中的“本机查询”)。这类似于DQL,但允许在命令中更灵活地使用数据库特定功能。在此模式下,您需要更详细地指定组件之间的关系。 - 使用PHP的PDO的SQL。您可以使用Doctrine_Connection获取PDO实例,从而编写查询,但仍然具有PDO提供的额外安全性和易用性。 - 原始SQL。虽然我不确定您为什么需要它,但我认为Doctrine提供了这个功能,如果没有,您可以完全退出Doctrine。
如果您在Symfony内部使用Doctrine,则即使启用了Doctrine,也没有任何将您锁定使用Doctrine的Symfony功能。
最后警告一句:如果您使用了一些Doctrine的高级功能(例如事件或行为),则在进行DQL之外的查询时,这些功能将变得难以绑定。

你的意思是“事件或行为”,比如“created_at”和“updated_at”吗? - jblue
如果您正在使用Doctrine的“Timestampable”行为,它将不会管理在Doctrine之外插入的记录。但是,Doctrine不会阻止您在任何情况下管理时间戳。 - Jeremy Kauffman

0

您可以随意混合和匹配。主要风险是在工具之间引入不兼容的不一致性。

假设情况如下:

如果我有一个名为User的doctrine2 ORM实体,并且我使用Zend_Db_Table在用户表上进行刷新之间更改某些值,那么我可能会遇到一些意外的副作用或不希望的行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接