PHP MySQL有效地由Lat Lng提供

时间:2015-03-04 11:40:55

标签: php mysql symfony doctrine-orm geolocation

我在MySQL上构建PHP应用程序,该应用程序应该接收坐标数组,并且应该从表格周围的地方返回。

我的方法是计算点周围的矩形,所以我有N,S,W,E限制坐标。这不是一个问题,但有很多重复的东西,我必须以某种方式删除。 所以我想到了make fet的数组并将它们从查询中排除。

$fetchedIds =[];
    foreach($json->points as $point){
        $Pqb = $em->getRepository('MyBundle:Places')->createQueryBuilder('p');
        $query = $Pqb->where(
            $Pqb->expr()->between(
                'p.latitude',':NB',':SB'
            )
        )
        ->andWhere(
            $Pqb->expr()->between(
                'p.longitude',':WB',':EB'
            )
        )
        ->andWhere(
            $Pqb->expr()->notIn(
                'p.id',':fetchedIds'
            )
        )
        ->setParameter('NB', $point[1])
        ->setParameter('SB', $point[0])
        ->setParameter('WB', $point[3])
        ->setParameter('EB', $point[2])
        ->setParameter('fetchedIds', $fetchedIds)
        ->getQuery();

        foreach ($query->execute() as $place) {
            $fetchedIds[] = $place->getId();
        }

    }

Thing is notIn使得这个查询得不到任何结果,即使它是空数组。

我错过了什么,我不知道是什么。 你还可以采用另一种更快的方法吗?

//编辑1:

好吧,这个速度在10k字段中需要大约36ms,但我仍然认为这可能会更快,以某种其他方式。

$POSqb = $em->getRepository('MyBundle:places')->createQueryBuilder('pos');
    $or = $POSqb->expr()->orX();

    foreach($json->points as $point){
        $or->add(
            $POSqb->expr()->andX(
                $POSqb->expr()->between(
                    'pos.latitude',$point[1],$point[0]
                ),
                $POSqb->expr()->between(
                    'pos.longitude',$point[3],$point[2]
                )
            )
        );
    }

    $query = $POSqb->where($or)->getQuery();

0 个答案:

没有答案