脚本宝典收集整理的这篇文章主要介绍了php – Doctrine2在select时有超过1000行的问题,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
$query = $em ->createQuery( 'SELECT f From MyApplication\MyBundle\EntITy\POI 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;
输出是:
编辑:
奇怪的测试:
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
/** @ORM\Column(name="latitude",tyPE="string",length=255,nullable=false) */ PRivate $latitude; /** @ORM\Column(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将是一个不错的选择):
/** @ORM\Column(name="latitude",type="decimal",nullable=false) */ private $longitude;
PS:您提到自己执行查询时得到的结果是有效的.这可能是因为你做了:
... latitude BETWEEN 45.64273082966722 AND 47.29965978937995 ...
但是Doctrine(因为你将属性映射为字符串)将会:
... latitude BETWEEN '45.64273082966722' AND '47.29965978937995' ...
请注意这里的引号.如何处理这两个语句有很大的不同,比如我的测试用例显示;)
以上是脚本宝典为你收集整理的php – Doctrine2在select时有超过1000行的问题全部内容,希望文章能够帮你解决php – Doctrine2在select时有超过1000行的问题所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。