PHP ORM:教义与Propel


126

我正在用symfony开始一个新项目,该项目可以很容易地与DoctrinePropel集成在一起,但是我当然需要做出选择...。我想知道是否有更多有经验的人在使用这些工具时有普遍的利弊?这两个中的任何一个?

非常感谢。

编辑: 感谢所有的答复,有用的东西。这个问题没有真正正确的答案,因此,我只将获得最多票数的人标记为已批准。


5
伙计们,有没有更新的回应?看到这种过时的方式
Qiniso 2015年

Answers:


76

我会选择主义。在我看来,这是一个更加活跃的项目,并且作为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。


42
在Propel 1.5中,此查询也可以写为Example_Query :: create()-> joinWith('FooBar')-> filterId(20)-> find()(如果Id是您的主键,则在joinWith之后查找findPK(20))键)。如您所见,它采用了Doctrine的漂亮语法,并添加了更多内容。该版本计划于2010年第一季度末发布,但是您现在可以在Symfony项目中对其进行测试。
Jan Fabry 2010年

很好的输入,我不知道:-)
phidah 2010年

9
对我来说,实施原则似乎要复杂得多。获取实体管理获取存储库...等等
SoWhat 2013年

1
教义是使事情复杂化的方法...只是公证是必经之路
Geomorillo

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。


4
Propel 1.5中的新查询改进确实非常不错。
汤姆(Tom)2010年

23

这取决于个人喜好。我之所以使用Propel是因为(除其他事项外)我喜欢所有东西都有其具体的吸气剂和吸气剂方法。在学说中,情况并非如此。

推进:

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

教义:

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

我喜欢使用getter和setter的原因是,如果需要,我可以在其中添加各种逻辑。但这只是我个人的喜好。

我还要补充一点,尽管Propel过去发展缓慢,但现在又在积极发展中。在过去的几个月中,它已经发布了几个新版本。Propel的最新版本包含一个类似于Doctrine的“流利查询界面”,因此,如果您不想使用Criteria,则不再需要。


7
在Doctrine中,您可以覆盖每个属性的setter和getter并具有自定义逻辑(请参阅doctrine-project.org/documentation/manual/1_2/en/…-搜索ATTR_AUTO_ACCESSOR_OVERRIDE以转到相关部分)
Marek Karbarz

看起来不错,但是您仍然可以通过调用以下命令来设置属性:$ x-> propname ='abc'; 这是有问题的,因为它似乎不支持传递多个参数。
lo_fye 2010年

20

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

我一直在开发Doctrine 2的Alpha版本,并且必须说它比Doctrine 1高出许多(只是我的看法,我从未使用过Propel)。当Doctrine社区发布时,很有可能朝着它前进。

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


4
最近发布了Doctrine 2的稳定版本。doctrine-project.org/blog/doctrine2-released
Trevor Allred

5

这两个参考文献有些过时了,因此您仍然涵盖了一些通用性,基本上,您必须像这样评估框架的经验,该原则的主要缺点是无法使用IDE来自动编写该代码。赢家,学习曲线的推动力和学说是非常不同的,如果您的项目需要使用理论来管理复杂的数据模型,并且您想快速使用ORM(最好记录在文档中并在Propel中找到更多支持),则更容易进行学习互联网的使用已经更加成熟,我相信使用最多。

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


在symfony世界中,Doctrine似乎无疑是最常用的-特别是对于较新的项目。当然,有很多SF 1.0项目仍在使用Propel,因为Doctrine直到1.1才可用于symfony。
皮达2010年

5

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


26
-1 IDE的自动补全不应该成为技术选择的原因
Clement Herreman 2012年

14
@ClementHerreman我同意这不应该成为标准,但是我相信选择一项特定技术可以产生多大的生产力肯定是选择它原因。因此,出于对我的敬意,我不同意您的反对意见...无论您是否同意答案,这都不是“错误”(或者是?),并且它有一定用处(除非错了,在这种情况下) ,则应说明这一点)。
Sepster

2
IMO,如果通过自动完成而不是软件质量,直观性和一致性来进一步提高生产率,那么将会发生一些奇怪的事情。请参阅codinghorror.com/blog/2009/01/…。但是你是对的,在某些时候这个答案是不对的,只是不够好,甚至不好。
克莱门特·赫雷曼

1
@ClementHerreman,如果是没有帮助的不要再使用它;)+1
AMD公司

是否有最新的回应?这已经过时了。
奇尼索2015年

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最为喜爱。


1
记录下来,这种比较是完全过时的-当前版本的Propel确实使用PDO,确实使用了支持多对多关系,并具有大量文档。还值得考虑:相对于DQL之类的专有查询语言,我们中的某些人更喜欢标准的标准生成器查询样式-它具有IDE支持,并且是一个类,因此您可以对其进行扩展。我仍在尝试选择,但是如果您不介意静态代码生成,并且可以看到“真正的” PHP代码相对于专有查询语言的优势,那么Propel相对于Doctrine而言有很多优点,这只是IDE的字符串。
mindplay.dk 2012年

2

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

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

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

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


1

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


@Mike:谢谢,不知道该插件,但似乎仅支持Sf1.2。最后,我最终选择了Doctrine,尽管这是更复杂的东西需要编写直接SQL的感觉,但这似乎是正确的选择。
汤姆(Tom)2010年

-2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.