cakephp3查询ifnull

cakephp3查询ifnull,cakephp,cakephp-3.0,resultset,query-builder,ifnull,Cakephp,Cakephp 3.0,Resultset,Query Builder,Ifnull,我想知道防止ResultSet中出现空结果的最佳方法是什么。我在蛋糕3.5.13上,我在使用案例,比如: private function addCase($isforeign, $source) { $query = $this->Sales->find(); return $query->newExpr() ->addCase( $query->newExpr()->add([

我想知道防止ResultSet中出现空结果的最佳方法是什么。我在蛋糕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()
吗?

函数生成器可以创建您想要的任何函数,您只需调用它,如果没有实现具体方法,生成器的magic method调用处理程序将创建一个通用函数调用,即
func()->ifnull()

但是,
IFNULL
是特定于MySQL/SQLite的,因此为了尽可能地保持可移植性,我建议只使用一个
ELSE
案例,如果条件评估为
FALSE
,则选择
0
而不是
NULL

$query
    ->newExpr()
    ->addCase(
        [
            $query->newExpr()->add([
                'Sales.isforeign' => $isforeign,
                'Sales.source' => $source
            ])
        ],
        [1, 0],
        ['integer', 'integer']
    );
生成的SQL类似于:

当(Sales.isforeign=0和Sales.source=1)然后为1,否则为0结束时的情况
另见


当我按照您的建议扩展addCase时,我收到以下SQL:
(SUM(CASE-When(Sales.isforeign=:c11和Sales.source=:c12)然后:param13 END))作为sourcenationalcount
。“我不会得到其他部分。@Seb您可能没有正确地更改它,从这里我看不出来。示例代码段按预期工作,您应该能够复制并粘贴它。我真傻!我错过了
$query->newExpr()…
周围的数组。非常感谢ndm!:)