我需要使用phalcon框架执行以下查询: “从表GROUP BY的ID中选择SELECT的ID具有'31'= ALL(array_agg(status))” 如何使用Phalcon执行此查询? 当我执行以下操作时:
Model::query()
->columns(['id'])
->groupBy('id')
->having('31 = ALL(array_agg(status))')
->execute();
我收到此错误消息: 语法错误,解析时出现意外令牌ALL,靠近'(array_agg(status))':SELECT id from [SomeNameSpace \ Model] GROUP BY [id] HAVING 31 = ALL(array_agg(status))(137)
答案 0 :(得分:0)
我不确定100%支持哪些Postgres函数,但是您可以尝试如下操作:
Model::query()
->columns([
'id',
'ALL(array_agg(status)) AS statusCounter'
])
->groupBy('id')
->having('31 = statusCounter')
->execute();
请注意,我将聚合函数移到了select而不是having
子句中。
更新:这是一个非常自定义查询的示例。不支持大多数使用的函数,有时编写一个简单的SQL查询并将所需的Model绑定到它上会更干净:
public static function findNearest($params = null)
{
// A raw SQL statement
$sql = '
SELECT *, 111.045 * DEGREES(ACOS(COS(RADIANS(:lat))
* COS(RADIANS(X(coords)))
* COS(RADIANS(Y(coords)) - RADIANS(:lng))
+ SIN(RADIANS(:lat))
* SIN(RADIANS(X(coords)))))
AS distance_in_km
FROM object_locations
ORDER BY distance_in_km ASC
LIMIT 0,5;
';
// Base model
$model = new ObjectLocations();
// Execute the query
return new \Phalcon\Mvc\Model\Resultset\Simple(
null,
$model,
$model->getReadConnection()->query($sql, $params)
);
}
// How to use:
\Models\ObjectLocations::findNearest([
'lat' => 42.4961756,
'lng' => 27.471543300000008
])
答案 1 :(得分:0)
您需要将ALL添加为方言扩展名。查看此主题,例如https://forum.phalconphp.com/discussion/16363/where-yearcurrenttimestamp-how-to-do-this