Symfony2应该使用哪个ORM?

12

我正在使用Symfony2开始一个新项目,但不确定要选择哪个ORM。我听说过关于Doctrine2的一些负面消息,特别是在继承和DQL方面。似乎Propel已经复苏了,但另一方面也不能保证它会永远存在。

你有什么建议吗?


1
我记得学习s1时,教程中列出了一些替代方案,我采用了其中的几个。但我后悔了,因为如果社区使用例如Doctrine这样的框架,所有的博客示例和SO评论都将围绕着Doctrine展开。所以即使Propel更适合(我不知道),从实用角度来看,D仍然是更好的选择。 - yitznewton
3个回答

11

我可以告诉你,Propel是与Symfony2一起使用的最合适的ORM。它运行良好,没有停止使用的计划。Propel2项目正在努力变得比Propel 1.6.x(曾经真的很棒)更好。

不要犹豫使用Propel,许多用户,包括Sensio Labs在内都在使用它!

这是Symfony2的Propel文档:http://www.propelorm.org/documentation/#working_with_symfony2

注意:Stack Exchange上有一个相关主题:https://softwareengineering.stackexchange.com/questions/48760/should-i-choose-doctrine-2-or-propel-1-5-1-6-and-why/117078#117078

我忘记了一些要点:

  • Behaviors是Propel的一部分,在Doctrine2中没有提供。这意味着Propel正式支持它们并提供支持/改进。不确定Doctrine是否有相应的功能。
  • Propel非常快。我同意对于大规模插入,Doctrine2比Propel更好。
  • Propel已经存在10年了,很稳定,有很多人在使用。
  • 不需要学习另一种语言来使用Propel。
  • 由于流畅的API,Propel2真正面向对象。
  • Doctrine2 ORM与ODM没有共享相同的API,因此您可以像D2 ORM和ODM一样使用Propel,这里没有优势。
  • Propel针对特定平台使用代码生成,因此它针对您的需求进行了优化,并且由于运行时和生成器部分而快速。

我喜欢Doctrine2中的一些要点:

  • 注释。
  • 整个代码,因为它相当新。

这个问题与Doctrine DBAL没有关系,而更多地涉及Doctrine ORM。同时,Propel2正在努力改进整个Propel 1.6.x代码。

哦,我长期使用Doctrine2 ;)


那个http://programmers.stackexchange.com的问题是关于选择ORM而与框架无关的。就我所理解的,只是关于选择ORM作为一个独立的工具。 - Vladislav Rastrusny
1
它与Symfony2有相当大的关联,正如我所说,几乎所有官方bundle也是不可知的,使用Doctrine ORM、ODM、Propel、Mandango等没有问题。 - William Durand
22
在您的帖子中,您可能应该披露与Propel的关联。 - Problematic

4

对于我个人而言,有几个原因让我选择Doctrine 2:

  • 从概念上来说,它非常容易理解。使用实体和实体管理器很简单。我喜欢实体不需要扩展任何基础模型类(如在Doctrine 1中)。

  • 现在它在Symfony2中是“标准ORM”(或者说是“准标准ORM”)。尽管Symfony2官方未正式“认可”它,但大多数人都在使用它,因此网络上有大量关于它的信息,这是非常有价值的。

你提到你听说过一些“关于Doctrine2的坏消息”,重要的是你要意识到没有哪个ORM会是完美的。我也遇到了一些问题,但只要你有创造性思维,就可以找到解决方案。有时这个解决方案意味着编写原始SQL,无论ORM纯粹主义者可能说什么。我没有遇到任何后悔使用Doctrine 2的情况。

我花了很多时间研究Propel,但我不喜欢它的工作方式。这并不是说它是一个编程不良的库,但对我个人来说不是一个好的选择。但由于每个开发者都不同,我能提供的最好建议是您查看两个库的文档和使用示例。因为你将成为使用它的人,而不是我们,你需要选择你认为你会从中受益最多的库。


嗯...不知道你在哪里看到DataMapper DP比ActiveRecord方法更容易。我同意实体很简单,但过于受限制了。 问题是当你想要构建真正的东西时,你必须理解D2背后的复杂性以及它的工作原理,这并不容易。即使你想构建复杂的东西,ActiveRecord也相当简单。 - William Durand
我熟悉Doctrine 1中的ActiveRecord。我同意它很容易使用,但在许多情况下,它不如数据映射器模式高效。 - Steven Mercatante
请给我提供一个使用情况,在这种情况下,DataMapper比AR更有效率? 例如,您尝试过嵌套树/集合吗? - William Durand
@Arms,你不觉得Doctrine2在查询中使用DQL函数的方式很糟糕吗?http://www.doctrine-project.org/2010/03/29/doctrine2-custom-dql-udfs.html 我的意思是,对于每个函数,我都必须首先添加扩展。这很愚蠢。 - hardik

1
我可以告诉你,Propel是与Symfony2一起使用的最合适的ORM。
我不同意。Doctrine2是Symfony的本地ORM。它包含在标准Symfony发行版中,可在此处获得:http://symfony.com/download Symfony文档主要描述了如何使用Doctrine,而不是Propel。因此,我认为选择Propel并不太明显。我认为你应该仔细权衡后果。我更喜欢Doctrine。
以下是Propel bundle支持的选项列表:http://www.propelorm.org/cookbook/symfony2/working-with-symfony2.html

没有什么是固有的,Doctrine将从Symfony2核心中删除(在2.1版本中),请阅读Fabien Potencier的最新博客文章。 - William Durand
@William DURAND,你指的是哪个博客?无论如何,现在(2.x分支)Doctrine肯定是本地的。官方文档也是关于Doctrine的,而不是其他ORM。此外,Doctrine的作者Jonathan H. Wage曾在Sensio Labs工作过一段时间。 - Vladislav Rastrusny
2
这篇文章不仅涉及Doctrine,还讲解了Propel。优秀的扩展包与Propel兼容性良好。 我知道Jonathan曾在SL工作,但如果他们雇用我,你会改变想法吗?我觉得不会 ;)我不是说Doctrine2不适合Symfony2,只是在实际使用中比较麻烦。基本用法很好,但如果你想做更多的事情,就会很困难。 - William Durand
@William DURAND:它有没有说Doctrine在2.1中被删除了?我错过了这部分吗?Fabien只是说,Symfony的ORM仅是可选依赖项。 - Vladislav Rastrusny
是的,这个问题将在明天的IRC会议上讨论。我邀请你来参加。据我所知,Doctrine和Propel将成为Symfony2“桥”的一部分。 - William Durand
@William DURAND 感谢邀请。我刚刚注意到,您是 Propel 的首席开发人员。无论如何,我希望 Propel 与 Symfony2 平起平坐。我希望在官方文档中使用 Propel 和 Symfony2 的文档能够公开。最重要的包已经可以用于 Propel、Doctrine 和我相信Symfony将成为领域内真正不可知的2.1版本。但目前,至少文档缺乏 Propel 的相关内容。 - Vladislav Rastrusny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接