为此疯狂......像往常一样,它可能是一些简单到愚蠢的东西,我只是没有看到。 3 个对象:Person
Address
Zip
Person
与 Address
有 OneToMany 关联
Address
与 Zip
有 ManyToOne 关联
Zip
有一个 lat
和 lon
领域
现在我想选择距离纬度/经度 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];
不是一个真正的解决方案,但现在可以。
最佳答案
就像 Arth 已经在他的评论中暗示的那样。您得到一个数组,因为 SELECT
子句未被解释为 fetch join
,但就好像您同时查询 c
(Person) 和 距离
。因此,您在一个数组中得到结果,其中 c
作为第一个成员,distance
作为第二个成员。您需要将 ...... AS distance
移出 SELECT
子句。我认为它应该可以工作。
关于mysql - 关联的 DQL 邮政编码距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24870965/