Browse Source

Add else when condition is not an array

Corey Taylor 4 years ago
parent
commit
c6b68e6df4

+ 8 - 10
src/Database/Expression/CaseExpression.php

@@ -60,11 +60,15 @@ class CaseExpression implements ExpressionInterface
      */
     public function __construct($conditions = [], $values = [], $types = [])
     {
+        $conditions = is_array($conditions) ? $conditions : [$conditions];
+        $values = is_array($values) ? $values : [$values];
+        $types = is_array($types) ? $types : [$types];
+
         if (!empty($conditions)) {
             $this->add($conditions, $values, $types);
         }
 
-        if (is_array($conditions) && is_array($values) && count($values) > count($conditions)) {
+        if (count($values) > count($conditions)) {
             end($values);
             $key = key($values);
             $this->elseValue($values[$key], isset($types[$key]) ? $types[$key] : null);
@@ -83,15 +87,9 @@ class CaseExpression implements ExpressionInterface
      */
     public function add($conditions = [], $values = [], $types = [])
     {
-        if (!is_array($conditions)) {
-            $conditions = [$conditions];
-        }
-        if (!is_array($values)) {
-            $values = [$values];
-        }
-        if (!is_array($types)) {
-            $types = [$types];
-        }
+        $conditions = is_array($conditions) ? $conditions : [$conditions];
+        $values = is_array($values) ? $values : [$values];
+        $types = is_array($types) ? $types : [$types];
 
         $this->_addExpressions($conditions, $values, $types);
 

+ 4 - 0
tests/TestCase/Database/Expression/CaseExpressionTest.php

@@ -43,6 +43,10 @@ class CaseExpressionTest extends TestCase
         $expected = 'CASE WHEN test = :c0 THEN :param1 WHEN test2 = :c2 THEN :param3 END';
         $this->assertSame($expected, $caseExpression->sql(new ValueBinder()));
 
+        $caseExpression = new CaseExpression($expr, ['foobar', 'else']);
+        $expected = 'CASE WHEN test = :c0 THEN :param1 ELSE :param2 END';
+        $this->assertSame($expected, $caseExpression->sql(new ValueBinder()));
+
         $caseExpression = new CaseExpression([$expr], ['foobar', 'else']);
         $expected = 'CASE WHEN test = :c0 THEN :param1 ELSE :param2 END';
         $this->assertSame($expected, $caseExpression->sql(new ValueBinder()));