gpt4 book ai didi

mysql - 关联的 DQL 邮政编码距离

转载 作者:行者123 更新时间:2023-11-29 03:34:27 24 4
gpt4 key购买 nike

为此疯狂......像往常一样,它可能是一些简单到愚蠢的东西,我只是没有看到。 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];

不是一个真正的解决方案,但现在可以。

最佳答案

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

关于mysql - 关联的 DQL 邮政编码距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24870965/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com