diff --git a/extensions/yii/gii/generators/model/Generator.php b/extensions/yii/gii/generators/model/Generator.php index 591cb3b..bcc2ea2 100644 --- a/extensions/yii/gii/generators/model/Generator.php +++ b/extensions/yii/gii/generators/model/Generator.php @@ -13,6 +13,7 @@ use yii\db\Connection; use yii\db\Schema; use yii\gii\CodeFile; use yii\helpers\Inflector; +use yii\base\NotSupportedException; /** * This generator will generate one or multiple ActiveRecord classes for the specified database table. @@ -247,7 +248,24 @@ class Generator extends \yii\gii\Generator foreach ($lengths as $length => $columns) { $rules[] = "[['" . implode("', '", $columns) . "'], 'string', 'max' => $length]"; } - + // Unique indexes rules + try { + $db = $this->getDbConnection(); + $uniqueIndexes = $db->getSchema()->findUniqueIndexes($table); + foreach ($uniqueIndexes as $indexName => $uniqueColumns) { + $attributesCount = count($uniqueColumns); + if ($attributesCount == 1) { + $rules[] = "['" . $uniqueColumns[0] . "', 'unique']"; + } elseif ($attributesCount > 1) { + $labels = array_intersect_key($this->generateLabels($table), array_flip($uniqueColumns)); + $lastLabel = array_pop($labels); + $columnsList = implode("', '", $uniqueColumns); + $rules[] = "[['" . $columnsList . "'], 'unique', 'targetAttribute' => ['" . $columnsList . "'], 'message' => 'The combination of " . implode(', ', $labels) . " and " . $lastLabel . " has already been taken.']"; + } + } + } catch (NotSupportedException $e) { + // doesn't support unique indexes information...do nothing + } return $rules; }