Skip to content

Commit a1fdd53

Browse files
committed
determine model key name correctly
1 parent bcb133e commit a1fdd53

File tree

2 files changed

+63
-10
lines changed

2 files changed

+63
-10
lines changed

Diff for: src/Illuminate/Validation/Concerns/ValidatesAttributes.php

+8-7
Original file line numberDiff line numberDiff line change
@@ -731,17 +731,17 @@ public function validateUnique($attribute, $value, $parameters)
731731
{
732732
$this->requireParameterCount(1, $parameters, 'unique');
733733

734-
[$connection, $table] = $this->parseTable($parameters[0]);
734+
[$connection, $table, $idColumn] = $this->parseTable($parameters[0]);
735735

736736
// The second parameter position holds the name of the column that needs to
737737
// be verified as unique. If this parameter isn't specified we will just
738738
// assume that this column to be verified shares the attribute's name.
739739
$column = $this->getQueryColumn($parameters, $attribute);
740740

741-
[$idColumn, $id] = [null, null];
741+
$id = null;
742742

743743
if (isset($parameters[2])) {
744-
[$idColumn, $id] = $this->getUniqueIds($parameters);
744+
[$idColumn, $id] = $this->getUniqueIds($idColumn, $parameters);
745745

746746
if (! is_null($id)) {
747747
$id = stripslashes($id);
@@ -767,12 +767,13 @@ public function validateUnique($attribute, $value, $parameters)
767767
/**
768768
* Get the excluded ID column and value for the unique rule.
769769
*
770+
* @param string|null $idColumn
770771
* @param array $parameters
771772
* @return array
772773
*/
773-
protected function getUniqueIds($parameters)
774+
protected function getUniqueIds($idColumn, $parameters)
774775
{
775-
$idColumn = $parameters[3] ?? 'id';
776+
$idColumn = $idColumn ?? $parameters[3] ?? 'id';
776777

777778
return [$idColumn, $this->prepareUniqueId($parameters[2])];
778779
}
@@ -829,11 +830,11 @@ public function parseTable($table)
829830
$model = new $table;
830831

831832
$table = $model->getTable();
832-
833833
$connection = $connection ?? $model->getConnectionName();
834+
$idColumn = $model->getKeyName();
834835
}
835836

836-
return [$connection, $table];
837+
return [$connection, $table, $idColumn ?? null];
837838
}
838839

839840
/**

Diff for: tests/Integration/Validation/ValidatorTest.php

+55-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Illuminate\Database\Eloquent\Model;
66
use Illuminate\Database\Schema\Blueprint;
77
use Illuminate\Support\Facades\Schema;
8+
use Illuminate\Support\Str;
89
use Illuminate\Tests\Integration\Database\DatabaseTestCase;
910
use Illuminate\Translation\ArrayLoader;
1011
use Illuminate\Translation\Translator;
@@ -19,19 +20,56 @@ protected function setUp(): void
1920

2021
Schema::create('users', function (Blueprint $table) {
2122
$table->increments('id');
23+
$table->string('uuid');
2224
$table->string('first_name');
2325
});
2426

25-
User::create(['first_name' => 'John']);
26-
User::create(['first_name' => 'John']);
27+
User::create(['uuid' => (string) Str::uuid(), 'first_name' => 'John']);
28+
User::create(['uuid' => (string) Str::uuid(), 'first_name' => 'Jim']);
2729
}
2830

2931
public function testExists()
3032
{
31-
$validator = $this->getValidator(['first_name' => ['John', 'Jim']], ['first_name' => 'exists:users']);
33+
$validator = $this->getValidator(['first_name' => ['John', 'Taylor']], ['first_name' => 'exists:users']);
3234
$this->assertFalse($validator->passes());
3335
}
3436

37+
public function testUnique()
38+
{
39+
$validator = $this->getValidator(['first_name' => 'John'], ['first_name' => 'unique:'.User::class]);
40+
$this->assertFalse($validator->passes());
41+
42+
$validator = $this->getValidator(['first_name' => 'John'], ['first_name' => 'unique:'.User::class.',first_name,1']);
43+
$this->assertTrue($validator->passes());
44+
45+
$validator = $this->getValidator(['first_name' => 'Taylor'], ['first_name' => 'unique:'.User::class]);
46+
$this->assertTrue($validator->passes());
47+
}
48+
49+
public function testUniqueWithCustomModelKey()
50+
{
51+
$_SERVER['CUSTOM_MODEL_KEY_NAME'] = 'uuid';
52+
53+
$validator = $this->getValidator(['first_name' => 'John'], ['first_name' => 'unique:'.UserWithUuid::class]);
54+
$this->assertFalse($validator->passes());
55+
56+
$user = UserWithUuid::where('first_name', 'John')->first();
57+
58+
$validator = $this->getValidator(['first_name' => 'John'], ['first_name' => 'unique:'.UserWithUuid::class.',first_name,'.$user->uuid]);
59+
$this->assertTrue($validator->passes());
60+
61+
$validator = $this->getValidator(['first_name' => 'John'], ['first_name' => 'unique:users,first_name,'.$user->uuid.',uuid']);
62+
$this->assertTrue($validator->passes());
63+
64+
$validator = $this->getValidator(['first_name' => 'John'], ['first_name' => 'unique:users,first_name,'.$user->uuid.',id']);
65+
$this->assertFalse($validator->passes());
66+
67+
$validator = $this->getValidator(['first_name' => 'Taylor'], ['first_name' => 'unique:'.UserWithUuid::class]);
68+
$this->assertTrue($validator->passes());
69+
70+
unset($_SERVER['CUSTOM_MODEL_KEY_NAME']);
71+
}
72+
3573
public function testImplicitAttributeFormatting()
3674
{
3775
$translator = new Translator(new ArrayLoader, 'en');
@@ -64,3 +102,17 @@ class User extends Model
64102
public $timestamps = false;
65103
protected $guarded = ['id'];
66104
}
105+
106+
class UserWithUuid extends Model
107+
{
108+
protected $table = 'users';
109+
public $timestamps = false;
110+
protected $guarded = ['id'];
111+
protected $keyType = 'string';
112+
public $incrementing = false;
113+
114+
public function getKeyName()
115+
{
116+
return 'uuid';
117+
}
118+
}

0 commit comments

Comments
 (0)