在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
包含我们想要与
Item
一起显示的
Product.model
。
以下是使用上述SQL检索相同“product.model”(产品型号)的数据库数据,但变化的是SQL参数:
$ret[0]->getProduct()->getModel();
$ret[0]['item']->getProduct()->getModel();
$ret[0]['model'];
我要表达的观点是:
根据你如何编写DQL / ORM SELECT语句,输出ResultSet结构可能会发生很大变化。从对象数组到对象的关联数组,再到关联数组,取决于您想要的选择方式。想象一下,如果您必须更改SQL,然后想象一下必须回到代码并重新执行与读取结果集中的数据相关的所有代码。哎呀!即使只有几行代码,您也依赖于结果集的结构,并没有完全解耦/通用标准。
Doctrine擅长的地方:
在某些方面,它消除了处理SQL、制作和维护自己的表格的工作。它并不完美。有时候会失败,您不得不进入MySQL命令行并键入SQL来调整事情,使Doctrine和您感到满意,让Doctrine看到列类型是有效的,并且您对列类型感到满意。您不必定义自己的外键或索引,这是由它自动完成的。
Doctrine不擅长的地方:
每当您需要将任何高级SQL翻译为DQL / ORM时,您可能会遇到困难。除此以外,您还可能会处理像上面那样的不一致性。
最后的想法:
我喜欢Doctrine为我创建/修改表格并将表格数据转换为对象以及将其持久化回来,以及使用准备好的语句和其他检查和平衡,使我的数据更安全。我喜欢感觉Doctrine从PHP面向对象接口中处理持久存储,我得到了这种刺痛的感觉,认为我的数据是我的代码的一部分,并且ORM负责与数据库交互的脏工作。数据库感觉更像一个本地变量,我已经意识到,如果您照顾好自己的数据,它会回报您。
我讨厌Doctrine的不一致性和陡峭的学习曲线,以及在我知道如何编写SQL时必须查找专有的DQL语法。 SQL知识是随时可用的,DQL没有那么多的专家(与SQL相比)可以在遇到困难时帮助您积累知识体系。