我正在使用symfony开始一个新项目,该项目很容易与Doctrine和Propel集成,但我当然需要做出选择....我想知道那里更有经验的人是否有一般的优点和/或缺点这两个中的任何一个?
非常感谢。
编辑: 感谢所有的回复,有用的东西。这个问题没有真正正确的答案,所以我只会将获得最受欢迎投票的那个标记为已批准。
我会选择教义。在我看来,这是一个更加活跃的项目,并且作为 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) 的下一个版本将包含很多改进,尤其是在创建 Criteria 方面(导致您编写的代码更少)。
我喜欢 Propel,因为它似乎没有 Doctrine 复杂:大多数代码都在少数生成的类中,而 Doctrine 将功能分解为许多类。我喜欢对我正在使用的库有一个很好的了解(不是太多的“魔法”),但是当然,我对 Propel 有更多的经验,所以也许 Doctrine 在幕后没有那么复杂。有人说 Propel 更快,但你应该自己检查一下,并考虑这是否超过了其他差异。
也许您还应该考虑不同框架的 Symfony 插件的可用性。我相信 Propel 在这里有优势,但我不知道列出的插件中有多少仍然与最新版本的 Symfony 保持同步。
这取决于个人喜好。我使用 Propel 是因为(除其他外)我喜欢一切都有自己的具体 getter 和 setter 方法的事实。在教义中,情况并非如此。
推进:
$person->setName('Derek');
echo $person->getName();
教义:
$person->name = 'Derek';
echo $person->name;
我喜欢 getter 和 setter 的原因是,如果需要,我可以将各种逻辑放入其中。但这只是我个人的喜好。
我还应该补充一点,尽管 Propel 过去发展缓慢,但它现在又在积极开发中。在过去的几个月里,它发布了几个新版本。最新版本的 Propel 包含一个类似于 Doctrine 的“流畅查询界面”,因此如果您不想使用 Criteria,则不必再使用。
应该注意的是, Doctrine 2目前正在开发中 发布[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。
这两个参考文献有些过时,因此您仍然涵盖了一些一般性,基本上您必须评估您对框架的体验,学说的一个主要缺点是无法拥有一个可以让您自动编码的 IDE一个赢家,学习曲线推进和学说是非常不同的,它更容易推进,如果你的项目需要管理复杂的数据模型,使用学说,如果你想快速使用文档最好的 ORM 并在 Propel 中找到更多支持互联网的用途,是成熟的多,相信用得最多。
我建议使用对 IDE 的自动完成功能更好的推进 1.6。
我不是 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 Plugin。这实际上是一个非常强大的插件,它支持两者,并且非常强大。我实际上比任何一个都更喜欢使用它。
如果我没记错的话,两个 ORM 都使用基于 XML 的模式,并且创建这些模式定义非常麻烦。如果您需要具有流畅风格的基于 PHP 的简单模式。你可以试试 LazyRecord https://github.com/c9s/LazyRecord它支持自动迁移和升级/降级脚本生成器。并且所有类文件都是静态生成的,没有运行时成本。