我会选择Doctrine。在我看来,它是一个更加活跃的项目,并且作为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中关系的处理方式。
我认为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)将包含很多改进,特别是在创建查询标准方面(这将使您需要编写的代码更少)。
我喜欢Propel,因为它似乎比Doctrine更简单:大部分代码都在少数生成的类中,而Doctrine则将功能拆分到许多类中。我喜欢对我正在使用的库有一个很好的理解(不要太多“魔法”),但当然,我对Propel有更多的经验,所以也许Doctrine在幕后并不那么复杂。一些人说Propel更快,但你应该自己测试并考虑这是否超过其他差异。
也许你还应该考虑不同框架的Symfony插件的可用性。我认为Propel在这方面有优势,但我不知道列出的插件有多少与最新版本的Symfony兼容。
这取决于个人偏好。我使用 Propel,因为(除了其他原因)我喜欢每个东西都有自己的具体 getter 和 setter 方法。在 Doctrine 中并非如此。
Propel:
$person->setName('Derek');
echo $person->getName();
Doctrine:
$person->name = 'Derek';
echo $person->name;
我喜欢使用getter和setter的原因是,如果需要的话,我可以在它们中加入各种逻辑。不过这只是我的个人偏好。
另外,我还应该补充一点,即使Propel过去发展缓慢,但现在它又在积极地开发中。过去几个月里,它已经发布了几个新版本。最近的Propel版本包含了一个类似于Doctrine的“流畅查询接口”,所以如果你不想使用Criteria,也可以使用它。
需要注意的是,Doctrine 2已经发布[ed],并且与当前稳定版本的Doctrine 1在功能上基本完全不同。它采用数据映射器模式(Data Mapper pattern)而不是Active Record,并使用“实体管理器”(entity manager)来处理持久性逻辑。发布后,它将更接近于Java的Hibernate(Doctrine 1更像Rails的ActiveRecord)。
我已经使用Doctrine 2的alpha版进行开发,并且必须说它比Doctrine 1(这只是我的个人意见,我从未使用过Propel)要好得多。 Doctrine社区很可能在发布后向它靠拢。
我鼓励您尝试使用Doctrine,但如果您喜欢Propel和Doctrine现在使用的Active Record风格,那么您可能想坚持使用Propel。
我建议使用 Propel 1.6,这对 IDE 的自动完成功能更好。
http://codeutopia.net/blog/2009/05/16/doctrine-vs-propel-2009-update/
http://trac.symfony-project.org/wiki/ComparingPropelAndDoctrine
"对于Symfony来说,Doctrine作为一种新一代ORM备受欢迎。"我建议使用DbFinder插件。这实际上是一个非常强大的插件,支持两种方式,并且非常好用。我实际上比起其他两种更喜欢使用它。