目前,我这样询问最小值和最大值:
$query = $query
->where(['date >=' => $today])
->select([
'minvalue' => $this->Daten->find()->func()->min('brennstoff'),
'maxvalue' => $this->Daten->find()->func()->max('brennstoff')
])
->hydrate(false)
->toArray();
有时最小值或最大值可能是NULL
,因此没有结果;但是我想要发出0
(零)。
在SQL中,我使用IF(MIN(value), MIN(value), 0))
。但是如何在ORM语法中翻译它?
答案 0 :(得分:0)
IF
非常具体,我建议使用CASE
表达式,CakePHP支持的所有SQL方言都能理解这一点。
虽然查询构建器可以通过函数构建器简单地调用具有相同名称的魔术方法来创建任何类型的SQL函数调用,例如:
$minValue = $query->func()->IF([
$query->newExpr()->isNotNull($query->func()->min('brennstoff')),
$query->func()->min('brennstoff'),
0
]);
$maxValue = $query->func()->IF([
$query->newExpr()->isNotNull($query->func()->max('brennstoff')),
$query->func()->max('brennstoff'),
0
]);
或IFNULL
更紧凑的事情:
$minValue = $query->func()->IFNULL([
$query->func()->min('brennstoff'),
0
]);
$maxValue = $query->func()->IFNULL([
$query->func()->max('brennstoff'),
0
]);
CASE
表达式有具体的辅助方法:
$minValue = $query
->newExpr()
->addCase(
[$query->newExpr()->isNotNull($query->func()->min('brennstoff'))],
[$query->func()->min('brennstoff'), 0],
[null, 'integer']
);
$maxValue = $query
->newExpr()
->addCase(
[$query->newExpr()->isNotNull($query->func()->max('brennstoff'))],
[$query->func()->max('brennstoff'), 0],
[null, 'integer']
);
$query = $query
->select([
'minvalue' => $minValue,
'maxvalue' => $maxValue
])
// ...
另见