PHP的ORMs:主义与推动
我正在开发一个新的symfony项目,这个项目很容易与Doctrine和Propel整合在一起,但是我当然需要做出一个select……我想知道更多有经验的人是否有一般的优点和/或缺点这两个?
非常感谢。
编辑:感谢所有的答复,有用的东西。 这个问题没有真正正确的答案,所以我只是把获得最受欢迎的选票标记为已经批准。
我会跟着学说去 在我看来,这是一个更为活跃的项目,并且作为symfony的默认ORM,它得到了更好的支持(尽pipe正式的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(); ?>
(学说的实现对我来说更直观)。
另外,我更喜欢你在教义中pipe理关系的方式。
我认为从Doctrine文档的这个页面值得一读: http : //www.doctrine-project.org/documentation/manual/1_2/en/introduction : doctrine-explained
总结一下:如果我开始一个新的项目,或者不得不在学习教义和推进之间做出select,那么我会在任何一天去学习。
我有些偏见,因为我对下一个版本的Propel有一点帮助,但是你必须考虑到Propel确实是第一个可用的ORM,然后在主体创build时落后了一点,但是现在又有了积极的发展。 Symfony 1.3 / 1.4附带Propel 1.4,大多数比较在Propel 1.3中停止。 此外,Propel(1.5)的下一个版本将包含许多改进,特别是在创buildCriteria(导致编写更less的代码)方面。
我喜欢Propel,因为它看起来不如Doctrine复杂:大多数代码是在less数生成的类中,而Doctrine已经在许多类中分离了function。 我喜欢对我使用的图书馆有一个很好的了解(不是太“魔术”),但是我对Propel有更多的经验,所以也许后台的教义不是那么复杂。 有人说Propel比较快,但你应该自己检查一下,并考虑这是否超过其他差异。
也许你还应该考虑不同框架的Symfony插件的可用性。 我相信Propel在这里有一个优势,但我不知道有多less上市的插件仍然与最新版本的Symfony保持同步。
这归结于个人喜好。 我使用Propel,因为(除其他外)我喜欢所有事物都有自己的具体的getter&setter方法的事实。 在学说中,情况并非如此。
推进:
$person->setName('Derek'); echo $person->getName();
教义:
$person->name = 'Derek'; echo $person->name;
我喜欢有getter&setter的原因是,如果需要,我可以在其中放入各种逻辑。 但这只是我个人的偏好。
我还要补充一点,虽然普罗佩尔过去是缓慢的,但现在又在积极发展。 它在过去几个月发布了几个新版本。 最新版本的Propel包含一个类似于Doctrine's的“stream畅的查询界面” ,所以如果你不想使用Criteria,你不必再使用Criteria。
应该指出, Doctrine 2 目前正在开发中 ,其function几乎完全不同于目前稳定版本的Doctrine 1.它依赖于Data Mapper模式而不是Active Record,并使用“实体pipe理器”来处理持久性逻辑。 在发布的时候,它会和Java的Hibernate更相似(Doctrine 1更像Rails的ActiveRecord)。
我一直在发展第二学说的阿尔法释放,而且必须说它是第一条的正面和负面的(只是我的意见,而我从来没有使用过普罗佩尔)。 在发布之后,这个学说社区将会朝着这个方向发展。
我鼓励你查看教义,但是如果你更喜欢现在推进和学说使用的活动logging风格,你可能想要坚持使用Propel。
这两个引用有些过时,所以你仍然覆盖一些概括性的,基本上你必须评估你的经验与框架本身,主要缺点是无法有一个IDE,让你自动代码的推动是一个获胜者,学习曲线推动和学说是非常不同的,如果你的项目需要pipe理复杂的数据模型使用原则,如果你想快速使用一个ORM,这是最好的logging,并find更多的支持推进互联网的使用,是更成熟,我相信大部分使用。
我build议使用propel 1.6这是更好的IDE的自动完成function。
我不是PHP 5的非框架ORM的用户,但是这里有一些比较好的post(如果你还没有看过):
http://codeutopia.net/blog/2009/05/16/doctrine-vs-propel-2009-update/
http://trac.symfony-project.org/wiki/ComparingPropelAndDoctrine
Symfony作为新一代的ORM,都受到教条的欢迎。
我build议使用DbFinder插件 。 这实际上是一个非常强大的插件,支持两者,而且是一个很好的强大的插件。 我其实更喜欢使用它。
如果我没有错,两个ORM都使用基于XML的模式,创build这些模式定义非常麻烦。 如果你需要一个stream畅的风格的基于PHP的简单模式。 您可以尝试LazyRecord https://github.com/c9s/LazyRecord它支持自动迁移和升级/降级脚本生成器。; 所有的类文件都是静态生成的,没有运行成本。