PHP ORMs:Doctrine vs. Propel

时间:2010-01-14 05:59:36

标签: php orm symfony1 doctrine propel

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

非常感谢。

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

10 个答案:

答案 0 :(得分:75)

我会选择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之间做出选择,我会在任何时候选择学说。

答案 1 :(得分: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。

答案 2 :(得分:22)

归结为个人偏好。 我使用Propel是因为(除其他事项外)我喜欢这样一个事实,即一切都有自己的具体吸气剂和放大器。二传法。在学说中,情况并非如此。

行走:

$person->setName('Derek');
echo $person->getName();

原则:

$person->name = 'Derek';
echo $person->name;

我喜欢吸气的原因&amp;如果我需要,我可以将各种逻辑放在其中。但这只是我个人的偏好。

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

答案 3 :(得分:20)

应该注意Doctrine 2 目前正处于开发状态 released [ed],其功能与当前稳定版本的Doctrine几乎完全不同1.它依赖于Data Mapper模式而不是Active Record,并使用“实体管理器”来处理持久性逻辑。发布后,它将与Java的Hibernate更接近(Doctrine 1更像是Rails的ActiveRecord)。

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

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

答案 4 :(得分:5)

这两个引用有点过时,所以你仍然涵盖了一些通用性,基本上你必须评估你对框架的体验,这个学说的一个主要缺点是无法拥有一个允许你自动编码的IDE。如果你的项目需要管理复杂的数据模型使用原则,如果你想快速使用最好记录的ORM并找到更多,那么推动是一个胜利者,学习曲线推进和学说是非常不同的,它更容易推动在Propel Internet使用中支持,更加成熟,我相信最常用的。

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

答案 5 :(得分:5)

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

答案 6 :(得分:2)

我不是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的最爱是最喜欢的。

答案 7 :(得分:2)

在使用了这两种方法多年之后,仅根据您如何构造查询逻辑,我更喜欢Propel 2而不是Doctrine。教义是它所能达到的深度,它的许多方面都与该深度层次相匹配。我觉得Propel具有更流畅和对象驱动的方式来构建和管理查询交互。

对我来说,这减少了模型中的代码,并增加了有关如何/将如何处理逻辑的结构。这导致只是将许多交互构建为通用功能。 (毕竟,对数据库所做的所有90%的操作只是某种程度的操作。)

最后,两者都很强大,可管理,并且可以完成工作。我的个人项目和兴趣爱好使用Propel ORM 2和将来的项目(如果仍然使用PHP编写)将采用这种方式。

在过去的3-4年中,我每天都使用这两种方法。

答案 8 :(得分:1)

我建议使用DbFinder Plugin。这实际上是一个非常强大的插件,支持两者,并且非常强大。我实际上比使用它更喜欢使用它。

答案 9 :(得分:-3)

如果我没错,两个ORM都使用基于XML的架构,并且创建这些架构定义非常麻烦。如果你需要一个基于PHP的简单模式,流畅的风格。您可以尝试LazyRecord https://github.com/c9s/LazyRecord它支持自动迁移和升级/降级脚本生成器。并且所有类文件都是静态生成的,没有运行时成本。