我如何在DQL学说中使用自定义操作员



我试图在查询中使用后gis函数。我正在使用jsor/doctrine-postgis软件包来为学说添加相关功能。我不确定是否对其进行了错误的配置或是否做错了事。

例如:

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

但是,这是不起作用的,因为语法检查器需要比较操作员。我收到以下错误:

错误:Expect =,<,< =,<>,>,> =,!

我通过检查True/false设法避免了此错误。虽然这是不可取的,但它起作用。

->其中('st_intersects(st.coords,st_makeenvelope(-1,-1,-1,1,1,4326)))= true')

,但我想使用&&操作员。我不确定该如何管理?我的意思是这样的事情:

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

但这返回错误:

错误:Expection =,<,< =,<>,>,> =,!=,get'&'

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

这是一个已知的错误。您无能为力。来自JSOR,作者

afaict,通过学说无法实施自定义操作员:(我认为我在这里做不到。我知道的唯一解决方案是使用学说的本机SQL功能。现在关闭。如果您有其他问题/想法。

因此,您唯一的选择是->createNativeQuery,如果您想使用要点索引,或者如果不在乎,则geometry_overlaps

您应该在其中添加" = 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()
            ;
    }

最新更新