0

Zur Zeit frage ich Min- und Max-Werte wie folgt aus:Wie kann ein Rückgabewert einer Aggregatfunktion bedingt ausgewählt werden?

$query = $query 
    ->where(['date >=' => $today]) 
    ->select([ 
     'minvalue' => $this->Daten->find()->func()->min('brennstoff'), 
     'maxvalue' => $this->Daten->find()->func()->max('brennstoff') 
    ]) 
    ->hydrate(false) 
    ->toArray(); 

die min oder MAXWERTE Manchmal NULL sein könnte, so wird es kein Ergebnis sein; aber ich möchte 0 (Null) ausgegeben werden.

In SQL würde ich IF(MIN(value), MIN(value), 0)) verwenden. Aber wie übersetzt man das in der ORM-Syntax?

Antwort

0

IF ist sehr MySQL-spezifisch, würde ich vorschlagen, stattdessen einen CASE Ausdruck verwenden, der von allen SQL-Dialekten verstanden wird, die von CakePHP unterstützt werden.

Während die Query Builder verwendet werden können, um jede Art von SQL-Funktionsaufruf zu erstellen, indem Sie einfach eine magische Methode mit dem gleichen Namen über die Funktionen Builder aufrufen, wie:

$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 
]); 

oder IFNULL für etwas kompaktere:

$minValue = $query->func()->IFNULL([ 
    $query->func()->min('brennstoff'), 
    0 
]); 

$maxValue = $query->func()->IFNULL([ 
    $query->func()->max('brennstoff'), 
    0 
]); 

gibt es konkrete Hilfsmethoden für CASE Ausdrücke:

$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 
    ]) 
    // ... 
auch 0

Siehe

Verwandte Themen