PHP ORMs:Doctrine vs. Propel

Tom*_*Tom 126 php orm propel doctrine symfony1

我正在使用symfony开始一个新项目,该项目很容易与DoctrinePropel集成,但我当然需要做出选择......我想知道那里有更多有经验的人是否有一般的优点和/或缺点这两个中的任何一个?

非常感谢.

编辑: 感谢所有的回复,有用的东西.对于这个问题没有真正正确的答案,所以我只会将获得最受欢迎的选票标记为已批准.

phi*_*dah 76

我会选择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();
?>
Run Code Online (Sandbox Code Playgroud)

(Doctrine的实现对我来说更直观).

另外,我更喜欢你在Doctrine中管理关系的方式.

我认为Doctrine文档中的这个页面值得一读:http://www.doctrine-project.org/documentation/manual/1_2/en/introduction : doctrine-explained

总结一下:如果我开始一个新项目或者不得不在学习Doctrine和Propel之间做出选择,我会在任何时候选择Doctrine.

  • 在Propel 1.5中,如果Id是您的主要参数,此查询也可以写为Example_Query :: create() - > joinWith('FooBar') - > filterId(20) - > find()(或者在joinWith之后的findPK(20)键).正如您所看到的,它采用了Doctrine的漂亮语法,并增加了一些.该版本计划于2010年第一季度末发布,但您现在可以在Symfony项目中进行测试. (42认同)
  • 对我来说,学说实施似乎要复杂得多.获取实体管理获取存储库......这个和那个 (9认同)

Jan*_*bry 40

我有偏见,因为我对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 1.5中的新查询改进确实非常好. (4认同)

lo_*_*fye 23

这取决于个人喜好.我使用Propel因为(除其他外)我喜欢这样一个事实,即一切都有自己的具体getter和setter方法.在学说中,情况并非如此.

推进:

$person->setName('Derek');
echo $person->getName();
Run Code Online (Sandbox Code Playgroud)

教义:

$person->name = 'Derek';
echo $person->name;
Run Code Online (Sandbox Code Playgroud)

我喜欢有吸气剂和定型器的原因是我可以在其中加入各种逻辑,如果需要的话.但这只是我个人的偏好.

我还要补充一点,虽然Propel过去发展缓慢,但它现在又在积极发展.它在过去几个月内发布了几个新版本.最新版本的Propel包含一个类似于Doctrine的"流畅查询界面",因此如果您不想使用,则不必再使用Criteria.

  • 在Doctrine中,您可以覆盖每个属性的setter和getter,并且还具有自定义逻辑(请参阅http://www.doctrine-project.org/documentation/manual/1_2/en/introduction-to-models - 搜索ATTR_AUTO_ACCESSOR_OVERRIDE以进入相关部分) (7认同)

Bry*_* M. 20

应当指出的学说2目前正在开发中 发布 [编者按]和功能几乎是从学说1当前稳定版本,它依靠数据映射模式,而不是活动记录,并使用"实体管理器"来处理持久性完全不同逻辑.发布后它将与Java的Hibernate更接近(Doctrine 1更像是Rails的ActiveRecord).

我一直在使用Doctrine 2的alpha版本进行开发,并且必须说它超越了Doctrine 1(仅仅是我的观点,而且我从未使用过Propel).当Doctrine社区发布时,它可能会向它发展.

我鼓励你查看Doctrine,但是如果你更喜欢Propel和Doctrine现在使用的Active Record风格,你可能只想坚持使用Propel.

  • 最近发布了一个稳定版本的Doctrine 2.http://www.doctrine-project.org/blog/doctrine2-released (4认同)

小智 5

这两个参考文献有点过时,所以你仍然可以涵盖一些通用性,基本上你必须评估你对框架的体验,这个学说的一个主要缺点就是无法让IDE让你自动编码.获胜者,学习曲线推进和学说是非常不同的,如果您的项目需要管理复杂的数据模型使用原则,如果您想快速使用最好记录的ORM并在Propel中找到更多支持,则更容易推动互联网使用,更成熟,我相信最常用.

http://propel.posterous.com/propel-141-is-out


pet*_*ara 5

我建议使用propel 1.6,它更适合IDE的自动完成功能.

  • -1 IDE的自动完成不应该是技术选择的原因 (26认同)
  • @ClementHerreman我同意它不应该是_the_标准,但我相信一个特定技术的生产力当然应该是选择它的理由.因此,在充分尊重的情况下,我不同意你的downvote ...无论你是否同意答案,它都不是"错误的"(或者是它?),它有一些用处(除非它是错的,在这种情况下) ,你应该说明这一点). (13认同)
  • IMO如果通过自动完成而不是软件质量,直观性和一致性来提高工作效率,那么就会发生一些奇怪的事情.请参阅http://www.codinghorror.com/blog/2009/01/the-sad-tragedy-of-micro-optimization-theater.html.但你是对的,在某些时候这个答案不是**错误**,只是不够好,甚至可能不好. (2认同)