cakePHP 3查询ifnull

时间:2018-03-06 10:53:00

标签: cakephp cakephp-3.0 resultset query-builder ifnull

我想知道在ResultSet中阻止null结果的最佳方法是什么。我在蛋糕3.5.13,我正在使用案例,如:

private function addCase($isforeign, $source)
{
    $query = $this->Sales->find();
    return $query->newExpr()
        ->addCase(
            $query->newExpr()->add([
                'Sales.isforeign' => $isforeign,
                'Sales.source' => $source
            ]),
            1,
            'integer');
}

然后我将addCase函数的返回放在

(..)
'sourcenationalcount' => $query->func()->sum($this->addCase(0, 1)),
(..)

现在sourcenationalcount可能变为null。什么是返回值0的最佳方法。我找不到func()->ifnull()。我应该使用formatResult()吗?

1 个答案:

答案 0 :(得分:2)

函数构建器可以创建你想要的任何函数,只需要调用它,构建器的魔术方法调用处理程序将创建一个泛型函数调用,以防没有实现具体方法,即func()->ifnull()只会工作。

但是,IFNULL是特定于MySQL / SQLite的,所以为了尽可能保持可移植性,我建议只使用ELSE个案例,选择0NULL如果条件评估为FALSE,则代替$query ->newExpr() ->addCase( [ $query->newExpr()->add([ 'Sales.isforeign' => $isforeign, 'Sales.source' => $source ]) ], [1, 0], ['integer', 'integer'] );

CASE WHEN (Sales.isforeign = 0 AND Sales.source = 1) THEN 1 ELSE 0 END

这应该生成类似于:

的SQL
$wgGroupPermissions['*']['edit'] = false;
$wgGroupPermissions['*']['read'] = false;
$wgRevokePermissions['user']['edit'] = true;
$wgRevokePermissions['user']['read'] = true;

另见