Doctrine2 DQL与不相关的表连接以获取两个实体

时间:2014-03-17 20:31:00

标签: doctrine-orm dql

我的DQL查询只返回FROM对象,如果另一个对象是相关的,这很好,但它不是。

我的查询:

$query = $this->em->createQuery('SELECT c, s FROM MyBundle:Person c, MyBundle:Spot s 
JOIN s.geo_data g JOIN g.features f WHERE f.active = true AND 
ST_Distance(f.location, c.location) < :distance GROUP BY c, s');

这在SQL中完美运行,为我提供了所有的点和所有人:距离。但是在DQL中,它只返回person对象,因为在数据库级别它们没有相关性,所以我无法获取正确的位置。

我的数据库设置正确,我使用的是PostGIS后端,而且点和人没有任何关联。它们碰巧在同一张地图上,我正在查询空间关系。

根据文件记录,它的预期行为,从我读到的,s是水合的,但根本没有返回,干得好!

我如何教DQL请回复我在SELECT中告诉它的内容?在哪里&#34;我的意思是我所说的,不再是一个聪明人&#34;切换?

2 个答案:

答案 0 :(得分:3)

如果它们不相关,那么Doc​​trine就不能给你这两个实体,因为如果它们是相关的,那么你将获得第一个实体c,你可以通过该关系获得它。

您可以尝试选择两个实体的所有字段,例如

SELECT c.location, ...,  s.geo_data, ...

这将为每个包含两个实体的所有字段的列提供一个数组。 如果需要,也许你可以使用结果集映射来获取实体。

答案 1 :(得分:0)

如果你想坚持使用Doctrine,你必须在地点和人之间定义一个OneToMany关系。通过这种方式,您可以设置PeopleRepository并设置一个方法,如getPeopleByLocationAndMaxDistance(Location $ location,$ distance)

SELECT p
FROM People AS p
LEFT JOIN Places AS pl
WHERE ST_Distance(p.location, pl.location) < :distance