DQL zipcode距离关联

时间:2014-07-21 17:20:06

标签: mysql doctrine-orm zend-framework2 dql

对此疯狂..像往常一样,它可能是一些愚蠢的简单,我只是没有看到。 3个对象:Person Address Zip

PersonAddress

有一个OneToMany关联

AddressZip

有ManyToOne关联

Zip有一个latlon字段

现在我想从纬度/经度中选择x公里范围内的所有人。 所以我得到了以下DQL:

SELECT c, ( 6371 * acos( cos( radians(52.377778951201) ) * cos( radians( z.lat ) ) * cos( radians( z.lon ) - radians(4.9055895401203) ) + sin( radians(52.377778951201) ) * sin( radians( z.lat ) ) ) ) AS distance FROM Person c LEFT JOIN c.addresses addr LEFT JOIN addr.zip z HAVING distance < ?4

这给出了0个结果,所以我在没有HAVING distance < ?4的情况下尝试但是它仍然有0个结果。

我没看到什么?

更新(回答,亲切......):

执行生成的SQL后(感谢@ChrisC)我发现我得到了预期的结果。 所以不得不在处理QueryBuilder的代码中进行一些挖掘。 我使用以下代码创建Paginator

$adapter = new DoctrineAdapter(new ORMPaginator($qb));
$paginator = new Paginator($adapter, true);
$paginator->setDefaultItemCountPerPage(10);

其中$qb是一种学说QueryBuilder

在我看来,我做了一个foreach:foreach ($paginator as $entity) 对于我使用QueryBuilder创建的几乎所有查询,这都可以正常工作 但是当我尝试从上面选择$entity时,不再是Person对象,而是包含Person对象作为其第一个元素的数组。作为临时解决方案,我现在在我的视图中执行以下操作:if (!is_object($entity)) $entity = $entity[0];

不是真正的解决方案,但现在会做。

1 个答案:

答案 0 :(得分:0)

就像Arth在他的评论中已经建议的那样。您得到一个数组,因为SELECT子句不被解释为fetch join,但好像您同时查询c(Person)和distance。因此,您可以在第一个成员c和第二个成员distance的数组中得到结果。您需要将...... AS distance移出SELECT子句。我认为它应该适用。