我如何在 Doctrine DQL 中使用自定义运算符?
How do I use custom-operators in Doctrine DQL?
我正在尝试在我的查询中使用 PostGIS 函数。我正在使用 jsor/doctrine-postgis
包来向 Doctrine 添加相关功能。我不确定是我配置不正确还是我做错了什么。
例如:
->where('ST_Intersects(st.coords,ST_MakeEnvelope(-1,-1,1,1,4326))')
但是这不起作用,因为语法检查器需要比较运算符。我收到以下错误:
Error: Expected =, <, <=, <>, >, >=, !=, got end of string
我通过检查 true/false 设法避免了这个错误。虽然这是不可取的,但它确实有效。
->哪里('ST_Intersects(st.coords,ST_MakeEnvelope(-1,-1,1,1,4326))=true')
但我想使用 &&
运算符。我不确定我该如何管理?我的意思是这样的:
->where('st.coords && ST_MakeEnvelope(-1,-1,1,1,4326))')
但是这个returns一个错误:
Error: Expected =, <, <=, <>, >, >=, !=, got '&'
我做错了什么吗?出于某种原因,这感觉过于复杂?
这是一个 known bug。你无能为力。来自jsor,作者
AFAICT, implementing custom operators isn't possible with Doctrine :( I don't think i can do much here. The only solution i'm aware of is using Doctrine's Native SQL feature. Closing for now. Feel free to reopen if you have further questions/ideas.
所以你唯一的选择是->createNativeQuery
if you want to make use of a GIST index, or geometry_overlaps
if you don't care.
您应该在末尾添加“= 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()
;
}
我正在尝试在我的查询中使用 PostGIS 函数。我正在使用 jsor/doctrine-postgis
包来向 Doctrine 添加相关功能。我不确定是我配置不正确还是我做错了什么。
例如:
->where('ST_Intersects(st.coords,ST_MakeEnvelope(-1,-1,1,1,4326))')
但是这不起作用,因为语法检查器需要比较运算符。我收到以下错误:
Error: Expected =, <, <=, <>, >, >=, !=, got end of string
我通过检查 true/false 设法避免了这个错误。虽然这是不可取的,但它确实有效。
->哪里('ST_Intersects(st.coords,ST_MakeEnvelope(-1,-1,1,1,4326))=true')
但我想使用 &&
运算符。我不确定我该如何管理?我的意思是这样的:
->where('st.coords && ST_MakeEnvelope(-1,-1,1,1,4326))')
但是这个returns一个错误:
Error: Expected =, <, <=, <>, >, >=, !=, got '&'
我做错了什么吗?出于某种原因,这感觉过于复杂?
这是一个 known bug。你无能为力。来自jsor,作者
AFAICT, implementing custom operators isn't possible with Doctrine :( I don't think i can do much here. The only solution i'm aware of is using Doctrine's Native SQL feature. Closing for now. Feel free to reopen if you have further questions/ideas.
所以你唯一的选择是->createNativeQuery
if you want to make use of a GIST index, or geometry_overlaps
if you don't care.
您应该在末尾添加“= 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()
;
}