diff --git a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php index e6c6b9817ba8..eba3599c8d42 100644 --- a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php +++ b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php @@ -13,6 +13,7 @@ use Egulias\EmailValidator\Validation\RFCValidation; use Egulias\EmailValidator\Validation\SpoofCheckValidation; use Exception; +use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Arr; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Date; @@ -815,7 +816,17 @@ protected function getUniqueExtra($parameters) */ public function parseTable($table) { - return Str::contains($table, '.') ? explode('.', $table, 2) : [null, $table]; + [$connection, $table] = Str::contains($table, '.') ? explode('.', $table, 2) : [null, $table]; + + if (Str::contains($table, '\\') && class_exists($table)) { + $model = new $table; + + if ($model instanceof Model) { + $table = $model->getTable(); + } + } + + return [$connection, $table]; } /** diff --git a/tests/Validation/ValidationValidatorTest.php b/tests/Validation/ValidationValidatorTest.php index 4ab6a9e0bb26..6d309750a480 100755 --- a/tests/Validation/ValidationValidatorTest.php +++ b/tests/Validation/ValidationValidatorTest.php @@ -11,6 +11,7 @@ use Illuminate\Contracts\Translation\Translator as TranslatorContract; use Illuminate\Contracts\Validation\ImplicitRule; use Illuminate\Contracts\Validation\Rule; +use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Arr; use Illuminate\Support\Carbon; use Illuminate\Translation\ArrayLoader; @@ -4293,6 +4294,36 @@ public function testExtractDataFromPath() $this->assertEquals(['cat' => ['cat1' => ['name' => '1']]], ValidationData::extractDataFromPath('cat.cat1.name', $data)); } + public function testParsingTablesFromModels() + { + $trans = $this->getIlluminateArrayTranslator(); + $v = new Validator($trans, [], []); + + $implicit_no_connection = $v->parseTable(ImplicitTableModel::class); + $this->assertEquals(null, $implicit_no_connection[0]); + $this->assertEquals('implicit_table_models', $implicit_no_connection[1]); + + $explicit_no_connection = $v->parseTable(ExplicitTableModel::class); + $this->assertEquals(null, $explicit_no_connection[0]); + $this->assertEquals('explicits', $explicit_no_connection[1]); + + $raw_no_connection = $v->parseTable('table'); + $this->assertEquals(null, $raw_no_connection[0]); + $this->assertEquals('table', $raw_no_connection[1]); + + $implicit_connection = $v->parseTable('connection.'.ImplicitTableModel::class); + $this->assertEquals('connection', $implicit_connection[0]); + $this->assertEquals('implicit_table_models', $implicit_connection[1]); + + $explicit_connection = $v->parseTable('connection.'.ExplicitTableModel::class); + $this->assertEquals('connection', $explicit_connection[0]); + $this->assertEquals('explicits', $explicit_connection[1]); + + $raw_connection = $v->parseTable('connection.table'); + $this->assertEquals('connection', $raw_connection[0]); + $this->assertEquals('table', $raw_connection[1]); + } + public function testUsingSettersWithImplicitRules() { $trans = $this->getIlluminateArrayTranslator(); @@ -4755,3 +4786,16 @@ public function getIlluminateArrayTranslator() ); } } + +class ImplicitTableModel extends Model +{ + protected $guarded = []; + public $timestamps = false; +} + +class ExplicitTableModel extends Model +{ + protected $table = 'explicits'; + protected $guarded = []; + public $timestamps = false; +}