Answers:
我会选择主义。在我看来,这是一个更加活跃的项目,并且作为symfony的默认ORM,它得到了更好的支持(即使正式认为ORM相等)。
此外,我更喜欢您使用查询的方式(DQL而不是Criteria):
<?php
// Propel
$c = new Criteria();
$c->add(ExamplePeer::ID, 20);
$items = ExamplePeer::doSelectJoinFoobar($c);
// Doctrine
$items = Doctrine_Query::create()
->from('Example e')
->leftJoin('e.Foobar')
->where('e.id = ?', 20)
->execute();
?>
(Doctrine的实现对我来说更加直观)。
另外,我真的更喜欢您在教义中处理关系的方式。
我认为,Doctrine文档中的此页面值得一读: http //www.doctrine-project.org/documentation/manual/1_2/en/introduction doctrine-explained
总结:如果我正在开始一个新项目,或者不得不在学习Doctrine和Propel之间进行选择,那么我每天都会选择Doctrine。
我有偏见,因为我对Propel的下一个发行版有所帮助,但是您必须考虑到Propel确实是第一个可用的ORM,然后在创建Doctrine时滞后了一段时间,但是现在又有了积极的发展。Symfony 1.3 / 1.4随Propel 1.4一起提供,大多数比较在Propel 1.3处停止。此外,Propel(1.5)的下一发行版将包含很多改进,尤其是在创建您的Criteria(减少编写代码)方面。
我喜欢Propel,因为它似乎没有Doctrine复杂:大多数代码都在少数几个生成的类中,而Doctrine已将功能拆分为许多类。我希望对正在使用的库有一个很好的了解(不是太多的“魔术”),但是我当然对Propel有更多的经验,因此Doctrine在幕后并不那么复杂。有人说Propel更快,但是您应该自己检查一下,并考虑是否超过其他差异。
也许您还应该考虑针对不同框架使用Symfony插件的可能性。我相信Propel在这里有优势,但是我不知道有多少列出的插件仍是最新版本的Symfony。
这取决于个人喜好。我之所以使用Propel是因为(除其他事项外)我喜欢所有东西都有其具体的吸气剂和吸气剂方法。在学说中,情况并非如此。
推进:
$person->setName('Derek');
echo $person->getName();
教义:
$person->name = 'Derek';
echo $person->name;
我喜欢使用getter和setter的原因是,如果需要,我可以在其中添加各种逻辑。但这只是我个人的喜好。
我还要补充一点,尽管Propel过去发展缓慢,但现在又在积极发展中。在过去的几个月中,它已经发布了几个新版本。Propel的最新版本包含一个类似于Doctrine的“流利查询界面”,因此,如果您不想使用Criteria,则不再需要。
应当指出的学说2是目前正在开发中 公布 [编者按]和功能几乎完全学说1.它依赖于数据映射模式,而不是活动记录的当前稳定版本不同,并使用“实体管理器”来处理持久逻辑。发布时,它将与Java的Hibernate更加相似(Doctrine 1更像Rails的ActiveRecord)。
我一直在开发Doctrine 2的Alpha版本,并且必须说它比Doctrine 1高出许多(只是我的看法,我从未使用过Propel)。当Doctrine社区发布时,很有可能朝着它前进。
我鼓励您检查Doctrine,但是如果您喜欢Propel和Doctrine现在使用的Active Record风格,则可能只想坚持使用Propel。
这两个参考文献有些过时了,因此您仍然涵盖了一些通用性,基本上,您必须像这样评估框架的经验,该原则的主要缺点是无法使用IDE来自动编写该代码。赢家,学习曲线的推动力和学说是非常不同的,如果您的项目需要使用理论来管理复杂的数据模型,并且您想快速使用ORM(最好记录在文档中并在Propel中找到更多支持),则更容易进行学习互联网的使用已经更加成熟,我相信使用最多。
我建议使用propel 1.6,它对IDE的自动完成功能更好。
我不是PHP 5非框架ORM的用户,但是这里有一些比较好的帖子(以防您尚未看到它们):
http://codeutopia.net/blog/2009/05/16/doctrine-vs-propel-2009-update/
http://trac.symfony-project.org/wiki/ComparingPropelAndDoctrine
两者的融合都对作为Symfony的新一代ORM的Doctrine最为喜爱。
都使用了多年之后,仅根据您如何构造查询逻辑,我更喜欢Propel 2而不是Doctrine。教义是它所能达到的深度,并且管理它的许多方面都与该深度层次相匹配。我觉得Propel具有更流畅和对象驱动的方式来构建和管理查询交互。
对我来说,这导致模型中的代码更少,而逻辑可以/将如何处理的结构也更多了。这导致只是将许多交互构建为通用功能。(毕竟,对数据库所做的所有90%的操作只是某种程度的操作。)
最后,两者都是强大的,可管理的,并且可以完成工作。我的个人项目和兴趣爱好使用Propel ORM 2和以后的项目(如果仍然使用PHP编写)将遵循这种方法。
在过去的3-4年中,我每天都在使用这两种工具。
我建议使用DbFinder插件。这实际上是一个非常强大的插件,同时支持这两种插件,并且非常强大。我实际上比任何一个都更喜欢使用它。
如果我没看错,那么两个ORM都使用基于XML的架构,并且创建这些架构定义非常麻烦。如果您需要具有流畅风格的基于PHP的简单架构。您可以尝试LazyRecord https://github.com/c9s/LazyRecord,它支持自动迁移和升级/降级脚本生成器。并且所有类文件都是静态生成的,而没有运行时成本。