为啥使用 Doctrine 而不是 CakePHP 的标准数据库 ORM?

Posted

技术标签:

【中文标题】为啥使用 Doctrine 而不是 CakePHP 的标准数据库 ORM?【英文标题】:Why use Doctrine instead of CakePHP's standard database ORM?为什么使用 Doctrine 而不是 CakePHP 的标准数据库 ORM? 【发布时间】:2012-09-19 20:44:06 【问题描述】:

我即将开始使用 Cakephp 2.2 开发一个新的 Web 项目,之前主要使用 Zend Framework 1。

乍一看,我真的很喜欢 CakePHP 处理模型和底层数据库表的方式,尤其是在快速设置一对多和多对多关系方面,并且尽量减少麻烦。坦率地说,与我以前在 Zend Framework 中做事的方式相比,这似乎是一股新鲜空气。

然而,在过去几年中,在使用 Zend Framework 时,我曾研究过使用 Doctrine 来提供 ZF 相当笨拙的模型关系。 Doctrine 在我看来非常强大和灵活。

所以现在我想知道,在我深入研究我的新 CakePHP 项目之前,我是否还应该考虑将 Doctrine 与我新选择的框架一起使用?与 CakePHP 的内置 ORM 和数据库功能相比,Doctrine 带来了哪些优势和劣势(不是双关语!)?

【问题讨论】:

【参考方案1】:

CakePHP 作为一个整体使用效果最好。在您的特定情况下,尽管您可以根据需要使用 Doctrine 代替 Cake 的 ORM,但您会失去很多 cake 的功能。例如。 FormHelper 会“神奇地”做很多事情,比如使用模型的模式猜测字段的正确输入类型等,在验证失败时自动在表单中的适当字段下方显示错误消息等。

正如您评论的那样,您对 Doctrine 也没有太多经验,因此我建议您坚持使用 CakePHP 的 ORM,并且仅在您发现它不足以满足您的需求时才寻找选项。

【讨论】:

我现在几乎已经完成了将一个旧项目从 ZF1 移植到 CakePHP 的工作(因为我不喜欢 ZF2 的发展方向),我认为你的回答几乎总结了我使用 CakePHP 的经验,所以远的。我喜欢它在设计上相对简单,并且可以看出在这个阶段使用 Doctrine 会使很多 CakePHP 的“魔法”变得多余。我现在将坚持使用 CakePHP 的 ORM,并在未来的某个时候看看 Doctrine。 自从我最初回答这个问题以来,情况发生了很大变化。 CakePHP 3.x 中的 ORM 已被重写,与以前的版本相比有了巨大的改进。它甚至可以单独使用github.com/cakephp/orm 反过来也是可能的:在 CakePHP 中使用另一个 ORM 库,但我个人认为没有任何理由这样做。 CakePHP 3.x 的 ORM 真是太棒了。 我最近开始了一个基于 CakePHP 3.2 的新项目,我必须说,ORM 看起来确实不错!【参考方案2】:

如果你已经使用过 Doctrine 和 CakePHP 的 ORM,你可以根据主要原因来决定改变:

什么可以提高您的工作效率? 什么会给您更多的可维护性? 什么可以减少您的学习曲线?

就个人而言,我会选择 Doctrine,因为它确实针对一个问题。

【讨论】:

我实际上还没有用 Doctrine 做任何认真的工作,只用 CakePHP 的 ORM 做了少量工作,刚好够我起草项目的一些基本功能。就我个人而言,就我目前所使用的而言,我认为 CakePHP 可以回答您的所有三个问题,至少从我目前所见的情况来看是这样。但是,我不得不怀疑,我是否会发现 CakePHP 的 ORM 缺少 Doctrine 提供的某些功能。

以上是关于为啥使用 Doctrine 而不是 CakePHP 的标准数据库 ORM?的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 通过组名而不是 ID 检查权限

CakePHP 通过 slug 而不是 ID 过滤列表

Symfony4 / Doctrine,如何选择“不同”的对象? getResult() 返回字符串数组,而不是对象数组

Cakephp:保存数组值而不是整数

Doctrine 1.2 保存记录关系 UPDATE 而不是 INSERT

Doctrine - 是不是可以将列结果与其他列结果而不是她的列名相关联