加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – Doctrine2在select时有超过1000行的问题

发布时间:2020-12-13 16:51:02 所属栏目:PHP教程 来源:网络整理
导读:我有这个查询,它返回给定区域中的所有POI: $query = $em -createQuery( 'SELECT f FROM MyApplicationMyBundleEntityPOI p WHERE (p.latitude BETWEEN :southEastLatitude AND :norhtWestLatitude) AND (p.longitude BETWEEN :southEastLongitude AND :n
我有这个查询,它返回给定区域中的所有POI:

$query = $em
            ->createQuery(
                    'SELECT f FROM MyApplicationMyBundleEntityPOI p
            WHERE (p.latitude BETWEEN :southEastLatitude AND :norhtWestLatitude) AND
                  (p.longitude BETWEEN :southEastLongitude AND :norhtWestLongitude)
            ORDER BY p.name
    ');

    $query->setParameter(":norhtWestLatitude",$northWestLat);
    $query->setParameter(":norhtWestLongitude",$northWestLng);
    $query->setParameter(":southEastLatitude",$southEastLat);
    $query->setParameter(":southEastLongitude",$southEastLng);

如果我尝试访问一个小区域(与差异较小的参数),我成功地得到了结果.我想我的结果可以达到1000行……我不太确定.

如果我尝试访问更大的区域,我得到一个空的结果集…

不知何故用更大区域的参数触发相同的查询,我得到了正确的结果集(~1060行).

所以我想知道学说的局限性(甚至是Symfony ???我在Symfony2项目中使用的学说),有什么?我也试过了$query-> setMaxResults(999999999);但它没有帮助……

有人有同样的问题吗?

编辑:也许php的内存使用量很高?我在getresult之前和之后添加了这些行:

echo "Memory usage before: " . (memory_get_usage() / 1024) . " KB" . PHP_EOL;
echo "Memory usage after: " . (memory_get_usage() / 1024) . " KB" . PHP_EOL;

输出是:

Memory usage after: 5964.0625 KB

Memory usage after: 10019.421875 KB

编辑:
奇怪的测试:

1)如果我测试这些参数:

WHERE
    (f.latitude BETWEEN 45.64273082966722 AND 47.29965978937995) AND
    (f.longitude BETWEEN 4.93262593696295 AND  9.99999999999999)

我得到了923行(正常行为)

2)如果我将参数9.999999999999更改为10.000000000(或某个大于9.9999999的数字),我的应用程序中的结果集为空.
数据库仍然返回923行(对于10.000000000).

编辑:
我可以解决这个问题,在这里讨论:https://groups.google.com/d/msg/doctrine-user/qLSon6m4nM4/y5vLztHcbDgJ

解决方法

从Doctrine2邮件列表中我了解到您将属性映射为“string”类型:

/** @ORMColumn(name="latitude",type="string",length=255,nullable=false) */
private $latitude;

/** @ORMColumn(name="longitude",nullable=false) */
private $longitude;

这意味着您的数据库将具有这些属性的VARCHAR列.因此,当db运行您的查询时,它将执行字符串比较.

字符串比较与(正常)数字比较不同.看到这些结果:

$a = 1234567890;
$b = 987654321;

echo $a == $b ? '0' : ($a < $b ? '-1' : '1');   // output:  1 (means $a is bigger than $b)

echo strcmp( $a,$b );                          // output: -8 (means $a is smaller than $b)

所以最好将属性映射为表示数据库中数字的东西(DECIMAL将是一个不错的选择):

/** @ORMColumn(name="latitude",type="decimal",nullable=false) */
private $longitude;

PS:您提到自己执行查询时得到的结果是有效的.这可能是因为你做了:

... latitude BETWEEN 45.64273082966722 AND 47.29965978937995 ...

但是Doctrine(因为你将属性映射为字符串)将会:

... latitude BETWEEN '45.64273082966722' AND '47.29965978937995' ...

请注意这里的引号.如何处理这两个语句有很大的不同,比如我的测试用例显示;)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读