Browse Source

Fix failing tests in IsUnique rule.

A while back the default behavior was changed in 3.2.x to make IsUnique
strict about nulls. When that code was merged into `3.next` I deleted
the 'duplicate' code. Then that change was reverted in `master` leaving
these tests failing. This restores the behavior and fixes the failing
tests.
Mark Story 9 years ago
parent
commit
86e24efc7d
1 changed files with 11 additions and 9 deletions
  1. 11 9
      src/ORM/Rule/IsUnique.php

+ 11 - 9
src/ORM/Rule/IsUnique.php

@@ -52,17 +52,14 @@ class IsUnique
         if (!$entity->extract($this->_fields, true)) {
             return true;
         }
-
-        $allowMultipleNulls = true;
-        if (isset($options['allowMultipleNulls'])) {
-            $allowMultipleNulls = $options['allowMultipleNulls'] === true ? true : false;
-        }
+        $options += ['allowMultipleNulls' => true];
+        $allowMultipleNulls = $options['allowMultipleNulls'];
 
         $alias = $options['repository']->alias();
-        $conditions = $this->_alias($alias, $entity->extract($this->_fields));
+        $conditions = $this->_alias($alias, $entity->extract($this->_fields), $allowMultipleNulls);
         if ($entity->isNew() === false) {
             $keys = (array)$options['repository']->primaryKey();
-            $keys = $this->_alias($alias, $entity->extract($keys));
+            $keys = $this->_alias($alias, $entity->extract($keys), $allowMultipleNulls);
             if (array_filter($keys, 'strlen')) {
                 $conditions['NOT'] = $keys;
             }
@@ -79,13 +76,18 @@ class IsUnique
      *
      * @param string $alias The alias to add.
      * @param array $conditions The conditions to alias.
+     * @param bool $multipleNulls Whether or not to allow multiple nulls.
      * @return array
      */
-    protected function _alias($alias, $conditions)
+    protected function _alias($alias, $conditions, $multipleNulls)
     {
         $aliased = [];
         foreach ($conditions as $key => $value) {
-            $aliased["$alias.$key"] = $value;
+            if ($multipleNulls) {
+                $aliased["$alias.$key"] = $value;
+            } else {
+                $aliased["$alias.$key IS"] = $value;
+            }
         }
         return $aliased;
     }