From 3002fb21a83a47140be614f267cf29bdd43c4a4e Mon Sep 17 00:00:00 2001 From: Thiago Talma Date: Tue, 17 Oct 2023 09:13:23 -0300 Subject: [PATCH 01/14] Update Generator.php --- src/generators/model/Generator.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/generators/model/Generator.php b/src/generators/model/Generator.php index 20eec2d63..e23e0ca9a 100644 --- a/src/generators/model/Generator.php +++ b/src/generators/model/Generator.php @@ -682,6 +682,7 @@ protected function generateRelations() // Foreign key could point to non-existing table: https://github.com/yiisoft/yii2-gii/issues/34 continue; } + $relName = $refs[0]; unset($refs[0]); $fks = array_keys($refs); $refClassName = $this->generateClassName($refTable); @@ -689,7 +690,7 @@ protected function generateRelations() // Add relation for this table $link = $this->generateRelationLink(array_flip($refs)); - $relationName = $this->generateRelationName($relations, $table, $fks[0], false); + $relationName = $this->generateRelationName($relations, $table, $relName, false); $relations[$table->fullName][$relationName] = [ "return \$this->hasOne($refClassNameResolution, $link);", $refClassName, From 8e3da3896febbebe8f3fdd2f1aab7b8371ddc9d6 Mon Sep 17 00:00:00 2001 From: Thiago Talma Date: Mon, 6 Nov 2023 17:44:28 -0300 Subject: [PATCH 02/14] getSupplier --- tests/generators/ModelGeneratorTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/generators/ModelGeneratorTest.php b/tests/generators/ModelGeneratorTest.php index 2eade2a90..c854cbf3b 100644 --- a/tests/generators/ModelGeneratorTest.php +++ b/tests/generators/ModelGeneratorTest.php @@ -135,12 +135,12 @@ public function relationsProvider() ]], ['product_language', 'ProductLanguage.php', false, [ [ - 'name' => 'function getSupplier()', + 'name' => 'function getProduct()', 'relation' => "\$this->hasOne(Product::className(), ['supplier_id' => 'supplier_id', 'id' => 'id']);", 'expected' => true, ], [ - 'name' => 'function getSupplier0()', + 'name' => 'function getSupplier()', 'relation' => "\$this->hasOne(Supplier::className(), ['id' => 'supplier_id']);", 'expected' => true, ], From 292c3b2f1c75398426e21a4e760e9839ff3f462f Mon Sep 17 00:00:00 2001 From: Thiago Talma Date: Mon, 6 Nov 2023 17:49:32 -0300 Subject: [PATCH 03/14] getUserRtl --- tests/generators/ModelGeneratorTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/generators/ModelGeneratorTest.php b/tests/generators/ModelGeneratorTest.php index c854cbf3b..6628d3b9b 100644 --- a/tests/generators/ModelGeneratorTest.php +++ b/tests/generators/ModelGeneratorTest.php @@ -169,7 +169,7 @@ public function relationsProvider() ]], ['blog_rtl', 'BlogRtl.php', false, [ [ - 'name' => 'function getUser()', + 'name' => 'function getUserRtl()', 'relation' => "\$this->hasOne(UserRtl::className(), ['id' => 'id_user']);", 'expected' => true, ], From e8a345cfb9169891eb3e9c9f1ae77bcf2b4fded0 Mon Sep 17 00:00:00 2001 From: Thiago Talma Date: Fri, 10 Nov 2023 18:52:13 -0300 Subject: [PATCH 04/14] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b9c76af4..672c7a2a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ Yii Framework 2 gii extension Change Log - Bug #532: Return `ExitCode::USAGE` on command input validation error (egmsystems) - Enh #537: Generating rules for the fields with default values (manky) +- Enh #542: Use the table name to create the relation (thiagotalma) 2.2.6 May 22, 2023 From 3624245d57878c64495cd8511a700833aa52f22f Mon Sep 17 00:00:00 2001 From: Thiago Talma Date: Mon, 13 Nov 2023 20:34:50 -0300 Subject: [PATCH 05/14] Add configuration --- src/generators/model/Generator.php | 25 +++++-------------------- src/generators/model/form.php | 1 + 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/src/generators/model/Generator.php b/src/generators/model/Generator.php index de759dbb2..569e34fad 100644 --- a/src/generators/model/Generator.php +++ b/src/generators/model/Generator.php @@ -52,6 +52,7 @@ class Generator extends \yii\gii\Generator public $generateJunctionRelationMode = self::JUNCTION_RELATION_VIA_TABLE; public $useClassConstant; public $generateRelationsFromCurrentSchema = true; + public $generateRelationNameFromDestinationTable = false; public $generateLabelsFromComments = false; public $useTablePrefix = false; public $standardizeCapitals = false; @@ -130,7 +131,7 @@ public function rules() [['generateRelations'], 'in', 'range' => [self::RELATIONS_NONE, self::RELATIONS_ALL, self::RELATIONS_ALL_INVERSE]], [['generateJunctionRelationMode'], 'in', 'range' => [self::JUNCTION_RELATION_VIA_TABLE, self::JUNCTION_RELATION_VIA_MODEL]], [ - ['generateLabelsFromComments', 'useTablePrefix', 'useSchemaName', 'generateQuery', 'generateRelationsFromCurrentSchema', 'useClassConstant', 'enableI18N', 'standardizeCapitals', 'singularize'], + ['generateLabelsFromComments', 'useTablePrefix', 'useSchemaName', 'generateQuery', 'generateRelationsFromCurrentSchema', 'generateRelationNameFromDestinationTable', 'useClassConstant', 'enableI18N', 'standardizeCapitals', 'singularize'], 'boolean' ], [['messageCategory'], 'validateMessageCategory', 'skipOnEmpty' => false], @@ -153,6 +154,7 @@ public function attributeLabels() 'generateRelations' => 'Generate Relations', 'generateJunctionRelationMode' => 'Generate Junction Relations As', 'generateRelationsFromCurrentSchema' => 'Generate Relations from Current Schema', + 'generateRelationNameFromDestinationTable' => 'Generate Relations Name Using Destination Table Name', 'useClassConstant' => 'Use `::class`', 'generateLabelsFromComments' => 'Generate Labels from DB Comments', 'generateQuery' => 'Generate ActiveQuery', @@ -195,6 +197,7 @@ class.', Make sure you also generate the junction models when using the "Via Model" option. ', 'generateRelationsFromCurrentSchema' => 'This indicates whether the generator should generate relations from current schema or from all available schemas.', + 'generateRelationNameFromDestinationTable' => 'This indicates whether the relation name should reflect the target table name.', 'useClassConstant' => 'Use the `::class` constant instead of the `::className()` method.', 'generateLabelsFromComments' => 'This indicates whether the generator should generate attribute labels by using the comments of the corresponding DB columns.', @@ -438,21 +441,12 @@ public function generateRules($table) { $types = []; $lengths = []; - $nullable = []; - $defaultValues = []; foreach ($table->columns as $column) { if ($column->autoIncrement) { continue; } if (!$column->allowNull && $column->defaultValue === null) { $types['required'][] = $column->name; - } elseif ($column->allowNull && $column->defaultValue === null) { - $nullable[] = $column->name; - } elseif (is_scalar($column->defaultValue)) { - if (array_key_exists($column->defaultValue, $defaultValues)) { - $defaultValues[$column->defaultValue] = []; - } - $defaultValues[$column->defaultValue][] = $column->name; } switch ($column->type) { case Schema::TYPE_SMALLINT: @@ -486,15 +480,6 @@ public function generateRules($table) } } $rules = []; - if (!empty($nullable)) { - $rules[] = "[['" . implode("', '", $nullable) . "'], 'default', 'value' => null]"; - } - if (!empty($defaultValues)) { - foreach ($defaultValues as $defaultValue => $defaultValueColumns) { - $defaultValue = is_numeric($defaultValue) ? $defaultValue : "'$defaultValue'"; - $rules[] = "[['" . implode("', '", $defaultValueColumns) . "'], 'default', 'value' => $defaultValue]"; - } - } $driverName = $this->getDbDriverName(); foreach ($types as $type => $columns) { if ($driverName === 'pgsql' && $type === 'integer') { @@ -700,9 +685,9 @@ protected function generateRelations() // Foreign key could point to non-existing table: https://github.com/yiisoft/yii2-gii/issues/34 continue; } - $relName = $refs[0]; unset($refs[0]); $fks = array_keys($refs); + $relName = $this->generateRelationNameFromDestinationTable ? $refTable : $fks[0]; $refClassName = $this->generateClassName($refTable); $refClassNameResolution = $this->generateClassNameResolution($refClassName); diff --git a/src/generators/model/form.php b/src/generators/model/form.php index 18cc8ddc3..0854cd8a5 100644 --- a/src/generators/model/form.php +++ b/src/generators/model/form.php @@ -32,6 +32,7 @@ Generator::JUNCTION_RELATION_VIA_MODEL => 'Via Model', ]); echo $form->field($generator, 'generateRelationsFromCurrentSchema')->checkbox(); +echo $form->field($generator, 'generateRelationNameFromDestinationTable')->checkbox(); echo $form->field($generator, 'useClassConstant')->checkbox(); echo $form->field($generator, 'generateLabelsFromComments')->checkbox(); echo $form->field($generator, 'generateQuery')->checkbox(); From 497fbbe43578ae3c51013e83a187faddf1f3ba28 Mon Sep 17 00:00:00 2001 From: Thiago Talma Date: Mon, 13 Nov 2023 20:39:53 -0300 Subject: [PATCH 06/14] tests --- tests/generators/ModelGeneratorTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/generators/ModelGeneratorTest.php b/tests/generators/ModelGeneratorTest.php index 6628d3b9b..94affcc6f 100644 --- a/tests/generators/ModelGeneratorTest.php +++ b/tests/generators/ModelGeneratorTest.php @@ -203,6 +203,7 @@ public function testRelations($tableName, $fileName, $useClassConstant, $relatio $generator = new ModelGenerator(); $generator->template = 'default'; $generator->generateRelationsFromCurrentSchema = false; + $generator->generateRelationNameFromDestinationTable = false; $generator->useClassConstant = $useClassConstant; $generator->tableName = $tableName; From e41f00c0cd39f8019c9845e92018dc049bba199b Mon Sep 17 00:00:00 2001 From: Thiago Talma Date: Mon, 13 Nov 2023 20:41:31 -0300 Subject: [PATCH 07/14] update test --- tests/generators/ModelGeneratorTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/generators/ModelGeneratorTest.php b/tests/generators/ModelGeneratorTest.php index 94affcc6f..a8fbe455e 100644 --- a/tests/generators/ModelGeneratorTest.php +++ b/tests/generators/ModelGeneratorTest.php @@ -203,7 +203,7 @@ public function testRelations($tableName, $fileName, $useClassConstant, $relatio $generator = new ModelGenerator(); $generator->template = 'default'; $generator->generateRelationsFromCurrentSchema = false; - $generator->generateRelationNameFromDestinationTable = false; + $generator->generateRelationNameFromDestinationTable = true; $generator->useClassConstant = $useClassConstant; $generator->tableName = $tableName; From af18ff39ff8cca8c599ff85ca6f53857cce2cb9a Mon Sep 17 00:00:00 2001 From: Thiago Talma Date: Tue, 14 Nov 2023 14:24:49 -0300 Subject: [PATCH 08/14] var Label --- src/generators/model/Generator.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/generators/model/Generator.php b/src/generators/model/Generator.php index 569e34fad..965b875d4 100644 --- a/src/generators/model/Generator.php +++ b/src/generators/model/Generator.php @@ -154,7 +154,7 @@ public function attributeLabels() 'generateRelations' => 'Generate Relations', 'generateJunctionRelationMode' => 'Generate Junction Relations As', 'generateRelationsFromCurrentSchema' => 'Generate Relations from Current Schema', - 'generateRelationNameFromDestinationTable' => 'Generate Relations Name Using Destination Table Name', + 'generateRelationNameFromDestinationTable' => 'Generate Relation Names Using Target Table Name', 'useClassConstant' => 'Use `::class`', 'generateLabelsFromComments' => 'Generate Labels from DB Comments', 'generateQuery' => 'Generate ActiveQuery', @@ -197,7 +197,7 @@ class.', Make sure you also generate the junction models when using the "Via Model" option. ', 'generateRelationsFromCurrentSchema' => 'This indicates whether the generator should generate relations from current schema or from all available schemas.', - 'generateRelationNameFromDestinationTable' => 'This indicates whether the relation name should reflect the target table name.', + 'generateRelationNameFromDestinationTable' => 'This indicates whether the relation names should use target table name.', 'useClassConstant' => 'Use the `::class` constant instead of the `::className()` method.', 'generateLabelsFromComments' => 'This indicates whether the generator should generate attribute labels by using the comments of the corresponding DB columns.', From aff47e9eced188aadfe0c1d7ce96cbd7977ba3c8 Mon Sep 17 00:00:00 2001 From: Thiago Talma Date: Thu, 16 Nov 2023 15:46:12 -0300 Subject: [PATCH 09/14] tests adjustments --- tests/generators/ModelGeneratorTest.php | 31 +++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/tests/generators/ModelGeneratorTest.php b/tests/generators/ModelGeneratorTest.php index a8fbe455e..dabe6e400 100644 --- a/tests/generators/ModelGeneratorTest.php +++ b/tests/generators/ModelGeneratorTest.php @@ -133,6 +133,18 @@ public function relationsProvider() 'expected' => true, ], ]], + ['product_language', 'ProductLanguage.php', false, [ + [ + 'name' => 'function getSupplier()', + 'relation' => "\$this->hasOne(Product::className(), ['supplier_id' => 'supplier_id', 'id' => 'id']);", + 'expected' => true, + ], + [ + 'name' => 'function getSupplier0()', + 'relation' => "\$this->hasOne(Supplier::className(), ['id' => 'supplier_id']);", + 'expected' => true, + ], + ]], ['product_language', 'ProductLanguage.php', false, [ [ 'name' => 'function getProduct()', @@ -144,7 +156,9 @@ public function relationsProvider() 'relation' => "\$this->hasOne(Supplier::className(), ['id' => 'supplier_id']);", 'expected' => true, ], - ]], + ], + true // $fromDestTable + ], ['organization', 'Organization.php', false, [ [ @@ -169,11 +183,20 @@ public function relationsProvider() ]], ['blog_rtl', 'BlogRtl.php', false, [ [ - 'name' => 'function getUserRtl()', + 'name' => 'function getUser()', 'relation' => "\$this->hasOne(UserRtl::className(), ['id' => 'id_user']);", 'expected' => true, ], ]], + ['blog_rtl', 'BlogRtl.php', false, [ + [ + 'name' => 'function getUserRtl()', + 'relation' => "\$this->hasOne(UserRtl::className(), ['id' => 'id_user']);", + 'expected' => true, + ], + ], + true + ], // useClassConstant = true ['category', 'Category.php', true, [ @@ -198,12 +221,12 @@ public function relationsProvider() * @param $useClassConstant bool * @param $relations array */ - public function testRelations($tableName, $fileName, $useClassConstant, $relations) + public function testRelations($tableName, $fileName, $useClassConstant, $relations, $fromDestTable = false) { $generator = new ModelGenerator(); $generator->template = 'default'; $generator->generateRelationsFromCurrentSchema = false; - $generator->generateRelationNameFromDestinationTable = true; + $generator->generateRelationNameFromDestinationTable = $fromDestTable; $generator->useClassConstant = $useClassConstant; $generator->tableName = $tableName; From ec916b19917af205d7a568a9847e465baf08ee05 Mon Sep 17 00:00:00 2001 From: Thiago Talma Date: Thu, 16 Nov 2023 15:53:12 -0300 Subject: [PATCH 10/14] update PHPDOC --- tests/generators/ModelGeneratorTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/generators/ModelGeneratorTest.php b/tests/generators/ModelGeneratorTest.php index dabe6e400..7a2ca6d46 100644 --- a/tests/generators/ModelGeneratorTest.php +++ b/tests/generators/ModelGeneratorTest.php @@ -220,6 +220,7 @@ public function relationsProvider() * @param $fileName string * @param $useClassConstant bool * @param $relations array + * @param $fromDestTable bool */ public function testRelations($tableName, $fileName, $useClassConstant, $relations, $fromDestTable = false) { From ee890b68dcdc91eccb1bb03110e57b5b00342932 Mon Sep 17 00:00:00 2001 From: Thiago Talma Date: Tue, 21 Nov 2023 12:01:15 -0300 Subject: [PATCH 11/14] CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 672c7a2a5..a61147b5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ Yii Framework 2 gii extension Change Log - Bug #532: Return `ExitCode::USAGE` on command input validation error (egmsystems) - Enh #537: Generating rules for the fields with default values (manky) -- Enh #542: Use the table name to create the relation (thiagotalma) +- Enh #543: Use the table name to create the relation (thiagotalma) 2.2.6 May 22, 2023 From c1a9661af7a9de5a2750b92917803cd28550b68d Mon Sep 17 00:00:00 2001 From: Thiago Talma Date: Tue, 21 Nov 2023 12:06:03 -0300 Subject: [PATCH 12/14] CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a61147b5c..873aadcf6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ Yii Framework 2 gii extension Change Log - Bug #532: Return `ExitCode::USAGE` on command input validation error (egmsystems) - Enh #537: Generating rules for the fields with default values (manky) -- Enh #543: Use the table name to create the relation (thiagotalma) +- Enh #544: Use the table name to create the relation (thiagotalma) 2.2.6 May 22, 2023 From 367d498a990a32e7a1ef14eacfb83113b5688fe5 Mon Sep 17 00:00:00 2001 From: Thiago Talma Date: Tue, 21 Nov 2023 12:08:55 -0300 Subject: [PATCH 13/14] Revert #537 --- src/generators/model/Generator.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/generators/model/Generator.php b/src/generators/model/Generator.php index 965b875d4..d5c55e080 100644 --- a/src/generators/model/Generator.php +++ b/src/generators/model/Generator.php @@ -441,12 +441,21 @@ public function generateRules($table) { $types = []; $lengths = []; + $nullable = []; + $defaultValues = []; foreach ($table->columns as $column) { if ($column->autoIncrement) { continue; } if (!$column->allowNull && $column->defaultValue === null) { $types['required'][] = $column->name; + } elseif ($column->allowNull && $column->defaultValue === null) { + $nullable[] = $column->name; + } elseif (is_scalar($column->defaultValue)) { + if (array_key_exists($column->defaultValue, $defaultValues)) { + $defaultValues[$column->defaultValue] = []; + } + $defaultValues[$column->defaultValue][] = $column->name; } switch ($column->type) { case Schema::TYPE_SMALLINT: @@ -480,6 +489,15 @@ public function generateRules($table) } } $rules = []; + if (!empty($nullable)) { + $rules[] = "[['" . implode("', '", $nullable) . "'], 'default', 'value' => null]"; + } + if (!empty($defaultValues)) { + foreach ($defaultValues as $defaultValue => $defaultValueColumns) { + $defaultValue = is_numeric($defaultValue) ? $defaultValue : "'$defaultValue'"; + $rules[] = "[['" . implode("', '", $defaultValueColumns) . "'], 'default', 'value' => $defaultValue]"; + } + } $driverName = $this->getDbDriverName(); foreach ($types as $type => $columns) { if ($driverName === 'pgsql' && $type === 'integer') { From 7762080d4548cf3ce4bae378023d655bbd218a08 Mon Sep 17 00:00:00 2001 From: Thiago Talma Date: Wed, 22 Nov 2023 15:10:16 -0300 Subject: [PATCH 14/14] CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 873aadcf6..672c7a2a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ Yii Framework 2 gii extension Change Log - Bug #532: Return `ExitCode::USAGE` on command input validation error (egmsystems) - Enh #537: Generating rules for the fields with default values (manky) -- Enh #544: Use the table name to create the relation (thiagotalma) +- Enh #542: Use the table name to create the relation (thiagotalma) 2.2.6 May 22, 2023