diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 47bb8835e9..adf4ba2caa 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -19,6 +19,7 @@ Yii Framework 2 Change Log - Bug #18648: Fix `yii\web\Request` to properly handle HTTP Basic Auth headers (olegbaturin) - Enh #18726: Added `yii\helpers\Json::$prettyPrint` (rhertogh) - Enh #18734: Added `yii\validators\EmailValidator::$enableLocalIDN` (brandonkelly) +- Bug #18756: Fix `\yii\validators\ExistValidator::queryValueExists` to validate against an array of unique values (DrDeath72) - Enh #18656: Added ability for `yii serve`'s `--router` param to take an alias (markhuot) - Bug #18274: Fix `yii\log\Logger` to calculate profile timings no matter the value of the flush interval (bizley) diff --git a/framework/validators/ExistValidator.php b/framework/validators/ExistValidator.php index eb86088d31..fb0761e1f8 100644 --- a/framework/validators/ExistValidator.php +++ b/framework/validators/ExistValidator.php @@ -280,7 +280,7 @@ class ExistValidator extends Validator private function queryValueExists($query, $value) { if (is_array($value)) { - return $query->count("DISTINCT [[$this->targetAttribute]]") == count($value) ; + return $query->count("DISTINCT [[$this->targetAttribute]]") == count(array_unique($value)) ; } return $query->exists(); } diff --git a/tests/framework/validators/ExistValidatorTest.php b/tests/framework/validators/ExistValidatorTest.php index 472c74e6b1..45759d9016 100644 --- a/tests/framework/validators/ExistValidatorTest.php +++ b/tests/framework/validators/ExistValidatorTest.php @@ -97,6 +97,13 @@ abstract class ExistValidatorTest extends DatabaseTestCase $m->test_val = [2, 3, 4, 5]; $val->validateAttribute($m, 'test_val'); $this->assertFalse($m->hasErrors('test_val')); + // existing non-unique array + $val = new ExistValidator(['targetAttribute' => 'ref']); + $val->allowArray = true; + $m = new ValidatorTestRefModel(); + $m->test_val = [2, 2, 3, 3, 4, 4, 5, 5]; + $val->validateAttribute($m, 'test_val'); + $this->assertFalse($m->hasErrors('test_val')); // non-existing array $val = new ExistValidator(['targetAttribute' => 'ref']); $val->allowArray = true;