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

标签 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];

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

最佳答案

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

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

相关文章:

javascript - 从 javascript 日历连接到 MySQL

mysql - 将旧 MySQL 数据库中的数据恢复到新的 Mac OSX 中

symfony - Symfony 3 实体的自定义 JSON 序列化程序

php - ZF2必填字段为空时如何设置消息?

mysql - 如何为 wiki 系列建立数据库?

java - 为什么我的连接表是空的? (使用 Hibernate 映射多对多)

php - Symfony ArrayCollection 与 PersistentCollection

symfony - @UniqueConstraint 和 @Column(unique=true) 选项之间的 Doctrine ORM 级别差异

php - 如何从模型中获取 Zend\Db\Adapter 实例? (ZF2)

php - ZF2 弃用 : ServiceManagerAwareInterface