From d15124eb667277bb9889408c1a986bc40b4c6f28 Mon Sep 17 00:00:00 2001 From: Mohamed Said Date: Tue, 3 Jan 2017 17:55:42 +0200 Subject: [PATCH] Fix validating distinct for nested keys (#17102) --- src/Illuminate/Validation/Validator.php | 6 ++++-- tests/Validation/ValidationValidatorTest.php | 3 +++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Illuminate/Validation/Validator.php b/src/Illuminate/Validation/Validator.php index c12ea54ee7b4..680a856a5be7 100755 --- a/src/Illuminate/Validation/Validator.php +++ b/src/Illuminate/Validation/Validator.php @@ -1338,8 +1338,10 @@ protected function validateDistinct($attribute, $value, $parameters) $attributeData = $this->extractDataFromPath($explicitPath); - $data = Arr::where(Arr::dot($attributeData), function ($value, $key) use ($attribute, $attributeName) { - return $key != $attribute && Str::is($attributeName, $key); + $pattern = str_replace('\*', '[^.]+', preg_quote($attributeName, '#')); + + $data = Arr::where(Arr::dot($attributeData), function ($value, $key) use ($attribute, $attributeName, $pattern) { + return $key != $attribute && (bool) preg_match('#^'.$pattern.'\z#u', $key); }); return ! in_array($value, array_values($data)); diff --git a/tests/Validation/ValidationValidatorTest.php b/tests/Validation/ValidationValidatorTest.php index 68fc7b138ca1..24871e6b2df2 100755 --- a/tests/Validation/ValidationValidatorTest.php +++ b/tests/Validation/ValidationValidatorTest.php @@ -1340,6 +1340,9 @@ public function testValidateDistinct() $v = new Validator($trans, ['foo' => ['bar' => ['id' => 1], 'baz' => ['id' => 2]]], ['foo.*.id' => 'distinct']); $this->assertTrue($v->passes()); + $v = new Validator($trans, ['foo' => [['id' => 1, 'nested' => ['id' => 1]]]], ['foo.*.id' => 'distinct']); + $this->assertTrue($v->passes()); + $v = new Validator($trans, ['foo' => [['id' => 1], ['id' => 1]]], ['foo.*.id' => 'distinct']); $this->assertFalse($v->passes());