如何在Doctrine DQL中使用自定义运算符?

时间:2017-11-24 16:10:41

标签: doctrine-orm postgis dql

我正在尝试在查询中使用PostGIS功能。我正在使用jsor/doctrine-postgis包向Doctrine添加相关功能。我不确定我是否错误地配置了它或者我做错了什么。

例如:

->where('ST_Intersects(st.coords,ST_MakeEnvelope(-1,-1,1,1,4326))')

但是这不起作用,因为语法检查程序需要比较运算符。我收到以下错误:

  

错误:预期=,<,< =,<>,>,> =,!=,得到字符串结尾

我设法通过检查true / false来避免此错误。虽然这是不可取的,但它确实有效。

- 化合物其中(' ST_Intersects(st.coords,ST_MakeEnvelope(-1,-1,1,1,4326))=真&#39)

但我想使用&&运算符。我不确定我该如何管理呢?我的意思是这样的:

->where('st.coords && ST_MakeEnvelope(-1,-1,1,1,4326))')

但这会返回错误:

  

错误:预期=,<,< =,<>,>,> =,!=,得到'&'

我做错了吗?由于某种原因,这感觉过于复杂了?

2 个答案:

答案 0 :(得分:1)

它是known bug。你无能为力。来自jsor,作者

  

AFAICT,使用Doctrine来实现自定义操作符是不可能的:(我不认为我可以在这里做很多事情。我唯一知道的解决方案是使用Doctrine's Native SQL feature。现在。如果您有其他问题/想法,请随时重新开启。

因此,如果您想使用GIST索引->createNativeQuery

,那么您唯一的选择就是or geometry_overlaps if you don't care.

答案 1 :(得分:0)

您应该在以下位置的末尾添加“ = true”:

     /**
     * @param string $bbox
     * @param int|null $limit
     * @return MyEntity[]
     */
    public function findByCoordinatesBoundingBox(string $bbox, int $limit = null): array
    {
        return $this->createQueryBuilder('n')
            ->where("ST_Intersects(n.coordinates, ST_MakeEnvelope({$bbox})) = true")
            ->orderBy('n.id', 'ASC')
            ->setMaxResults($limit)
            ->getQuery()
            ->getResult()
            ;
    }