来自Doctrine Query Language 文档:
初学者的一个常见错误是将 DQL 误认为只是某种形式的 SQL,因此试图在查询中使用表名和列名或将任意表连接在一起。您需要将 DQL 视为对象模型的查询语言,而不是关系模式的查询语言。
如果你想使用对象(实体),每个都有自己的存储库,你不应该考虑 SQL(或JOIN
ing 表),因为存储库和DQL 查询将始终只返回单一类型的 object。
ORM 的目的是让您将其视为对象(而不是表),而无需考虑持久层的技术实现:考虑关联,而不是join
s;必要的 SQL 查询会根据需要在后台自动执行,而无需过多考虑过早的优化(Doctrine 对性能并不理想;但有时许多查询可能比一个大的单个连接查询更快)。
如果您从多个 SQL 表(如此多种类型)获取连接数据,那么您的查询结果记录不再代表每个单个/唯一对象,而是每个记录是来自多个表并涉及多个模型的数据的混搭。
如果您进行查询,ORM 应该映射什么实体SELECT seller.*, product.name, product.price, category.name FROM ..
?
只是映射到卖方?缺少属性的产品?
应该从 SQL 结果的每条记录映射哪个单个实体,例如:
+-----------+-------------+-----------------+---------------+-----------------+
| seller.id | seller.name | product.name | product.price | category.name |
+-----------+-------------+-----------------+---------------+-----------------+
| 42 | Alan Smith | Apple MacBook | 1500$ | Computer&Mobile |
| 42 | Alan Smith | Apple MacBook | 1850$ | Computer&Mobile |
| 42 | Alan Smith | Dell XPS | 1500$ | Computer&Mobile |
| 34 | Jane Foley | Clarinet Selmer | 1720$ | Music |
+-----------+-------------+-----------------+---------------+-----------------+
?
ORM 无法猜测!
因此,您需要一个自定义映射器来告诉 Doctrine 如何从包含混合数据的 SQL 行中构建实体对象(模型)。
查看Native SQL 文档,了解如何构建自己的ResultSetMapping
.