在 2016 年使用 Doctrine ORM,大约有 2 - 2.5 年的经验。
固有的不一致
SELECT i, p
FROM \Entity\Item i
JOIN i.product p
WHERE ...
假设实体是Item
和Product
。它们通过 连接Item.product_id
到Product.id
,并Product
包含Product.model
我们要与 一起显示的内容Item
。
这是从数据库中检索相同的“product.model”,使用上述 SQL 但不同的 SQL 参数:
//SELECT i, p
$ret[0]->getProduct()->getModel();
//SELECT i as item, p as product
$ret[0]['item']->getProduct()->getModel();
//SELECT i as item, p.model as model
$ret[0]['model'];
我要说的是:
根据您编写 DQL/ORM SELECT 语句的方式,输出结果集结构可能会发生巨大变化。
从对象数组到关联对象数组,再到关联数组数组,取决于您想要的方式SELECT
。想象一下,您必须对 SQL 进行更改,然后想象必须回到您的代码并重新执行与从结果集中读取数据相关的所有代码。哎哟! 哎哟! 哎哟! 即使是几行代码,你也依赖于结果集的结构,没有完全的解耦/通用标准。
教义擅长什么
在某些方面,它消除了处理 SQL、制作和维护自己的表。这并不完美。有时它会失败,您必须转到 MySQL 命令行并键入 SQL 以将内容调整到 Doctrine 和您满意的位置,Doctrine 认为列类型有效的位置以及您对列类型满意的位置。您不必定义自己的外键或索引,它会自动为您完成。
教义不擅长什么
每当您需要将任何非常高级的 SQL 转换为 DQL/ORM 时,您都可能会遇到困难。除此之外,您还可以处理上述不一致的情况。
最后的想法
我喜欢 Doctrine 为我创建/修改表,将表数据转换为对象,并将它们持久化,并使用准备好的语句和其他检查和平衡,使我的数据更安全。
我喜欢 Doctrine 从 PHP 的面向对象接口中处理持久存储的感觉。我有一种刺痛的感觉,我可以将我的数据视为我的代码的一部分,而 ORM 负责处理与数据库交互的脏东西。数据库感觉更像是一个局部变量,我很感激如果你照顾好你的数据,它会爱你。
我讨厌 Doctrine,因为它的不一致和艰难的学习曲线,当我知道如何用 SQL 编写东西时,我不得不查找 DQL 的专有语法。SQL 知识很容易获得,DQL 没有那么多专家在野外,也没有积累的知识体系(与 SQL 相比)可以在您遇到困难时为您提供帮助。