Skip to content

Commit 834fa6d

Browse files
committed
Merge #47 remote-tracking branch 'php-openapi/29-extension-fk-column-name-cause-error-in-case-of-column-name-without-underscore'
* php-openapi/29-extension-fk-column-name-cause-error-in-case-of-column-name-without-underscore: Delete file Complete the test Fix failing tests 2 Fix failing tests Fix bug 2 Fix bug Fix relation name in `targetRelation` bug Refactor Fix failing tests Fix failing tests in PHP >= 8 Fix this issue Add sub-tasks
2 parents e26e216 + 452773a commit 834fa6d

File tree

37 files changed

+475
-45
lines changed

37 files changed

+475
-45
lines changed

src/lib/AttributeResolver.php

+14-7
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77

88
namespace cebe\yii2openapi\lib;
99

10-
use cebe\yii2openapi\lib\Config;
11-
use cebe\yii2openapi\lib\CustomSpecAttr;
1210
use cebe\yii2openapi\lib\exceptions\InvalidDefinitionException;
1311
use cebe\yii2openapi\lib\items\Attribute;
1412
use cebe\yii2openapi\lib\items\AttributeRelation;
@@ -22,7 +20,6 @@
2220
use Yii;
2321
use yii\helpers\Inflector;
2422
use yii\helpers\StringHelper;
25-
use yii\helpers\VarDumper;
2623
use function explode;
2724
use function strpos;
2825
use function strtolower;
@@ -268,7 +265,7 @@ protected function resolveProperty(
268265

269266
$relation = Yii::createObject(
270267
AttributeRelation::class,
271-
[$property->getName(), $relatedTableName, $relatedClassName]
268+
[static::relationName($property->getName(), $property->fkColName), $relatedTableName, $relatedClassName]
272269
)
273270
->asHasOne([$fkProperty->getName() => $attribute->columnName]);
274271
$relation->onUpdateFkConstraint = $property->onUpdateFkConstraint;
@@ -319,7 +316,7 @@ protected function resolveProperty(
319316
$this->relations[$property->getName()] =
320317
Yii::createObject(
321318
AttributeRelation::class,
322-
[$property->getName(), $relatedTableName, $relatedClassName]
319+
[static::relationName($property->getName(), $property->fkColName), $relatedTableName, $relatedClassName]
323320
)
324321
->asHasMany([$fkProperty->getName() => $fkProperty->getName()])->asSelfReference();
325322
return;
@@ -328,7 +325,7 @@ protected function resolveProperty(
328325
$this->relations[$property->getName()] =
329326
Yii::createObject(
330327
AttributeRelation::class,
331-
[$property->getName(), $relatedTableName, $relatedClassName]
328+
[static::relationName($property->getName(), $property->fkColName), $relatedTableName, $relatedClassName]
332329
)
333330
->asHasMany([$foreignPk => $this->componentSchema->getPkName()]);
334331
return;
@@ -347,7 +344,7 @@ protected function resolveProperty(
347344
$this->relations[$property->getName()] =
348345
Yii::createObject(
349346
AttributeRelation::class,
350-
[$property->getName(), $relatedTableName, $relatedClassName]
347+
[static::relationName($property->getName(), $property->fkColName), $relatedTableName, $relatedClassName]
351348
)
352349
->asHasMany([Inflector::camel2id($this->schemaName, '_') . '_id' => $this->componentSchema->getPkName()]);
353350
return;
@@ -498,4 +495,14 @@ protected function resolvePropertyRef(PropertySchema $property, Attribute $attri
498495
$this->attributes[$property->getName()] =
499496
$attribute->setFakerStub($this->guessFakerStub($attribute, $fkProperty));
500497
}
498+
499+
public static function relationName(string $propertyName, ?string $fkColumnName): string
500+
{
501+
$fkColumnName = (string) $fkColumnName;
502+
$relationName = $propertyName;
503+
if (!str_contains($fkColumnName, '_')) {
504+
$relationName = strtolower($fkColumnName) === strtolower($relationName) ? $relationName . 'Rel' : $relationName;
505+
}
506+
return $relationName;
507+
}
501508
}

src/lib/ValidationRulesBuilder.php

+4-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use cebe\yii2openapi\lib\items\Attribute;
1111
use cebe\yii2openapi\lib\items\DbModel;
1212
use cebe\yii2openapi\lib\items\ValidationRule;
13+
use yii\helpers\Inflector;
1314
use function count;
1415
use function implode;
1516
use function in_array;
@@ -176,10 +177,12 @@ private function addExistRules(array $relations):void
176177
} elseif ($attribute->phpType === 'string') {
177178
$this->addStringRule($attribute);
178179
}
180+
181+
$targetRelation = AttributeResolver::relationName(Inflector::variablize($attribute->camelName()), $attribute->fkColName);
179182
$this->rules[$attribute->columnName . '_exist'] = new ValidationRule(
180183
[$attribute->columnName],
181184
'exist',
182-
['targetRelation' => $attribute->camelName()]
185+
['targetRelation' => $targetRelation]
183186
);
184187
}
185188
}

tests/specs/blog/models/base/Comment.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ public function rules()
3232
'trim' => [['post_id'], 'trim'],
3333
'required' => [['post_id', 'author_id', 'message', 'created_at'], 'required'],
3434
'post_id_string' => [['post_id'], 'string', 'max' => 128],
35-
'post_id_exist' => [['post_id'], 'exist', 'targetRelation' => 'Post'],
35+
'post_id_exist' => [['post_id'], 'exist', 'targetRelation' => 'post'],
3636
'author_id_integer' => [['author_id'], 'integer'],
37-
'author_id_exist' => [['author_id'], 'exist', 'targetRelation' => 'Author'],
37+
'author_id_exist' => [['author_id'], 'exist', 'targetRelation' => 'author'],
3838
'message_default' => [['message'], 'default', 'value' => []],
3939
'meta_data_default' => [['meta_data'], 'default', 'value' => []],
4040
'created_at_integer' => [['created_at'], 'integer'],

tests/specs/blog/models/base/Post.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ public function rules()
3434
'trim' => [['title', 'slug', 'created_at'], 'trim'],
3535
'required' => [['title', 'category_id', 'active'], 'required'],
3636
'category_id_integer' => [['category_id'], 'integer'],
37-
'category_id_exist' => [['category_id'], 'exist', 'targetRelation' => 'Category'],
37+
'category_id_exist' => [['category_id'], 'exist', 'targetRelation' => 'category'],
3838
'created_by_id_integer' => [['created_by_id'], 'integer'],
39-
'created_by_id_exist' => [['created_by_id'], 'exist', 'targetRelation' => 'CreatedBy'],
39+
'created_by_id_exist' => [['created_by_id'], 'exist', 'targetRelation' => 'createdBy'],
4040
'title_unique' => [['title'], 'unique'],
4141
'slug_unique' => [['slug'], 'unique'],
4242
'title_string' => [['title'], 'string', 'max' => 255],

tests/specs/blog_v2/models/base/Comment.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ public function rules()
3232
'trim' => [['message', 'meta_data', 'created_at'], 'trim'],
3333
'required' => [['post_id', 'message', 'created_at'], 'required'],
3434
'post_id_integer' => [['post_id'], 'integer'],
35-
'post_id_exist' => [['post_id'], 'exist', 'targetRelation' => 'Post'],
35+
'post_id_exist' => [['post_id'], 'exist', 'targetRelation' => 'post'],
3636
'user_id_integer' => [['user_id'], 'integer'],
37-
'user_id_exist' => [['user_id'], 'exist', 'targetRelation' => 'User'],
37+
'user_id_exist' => [['user_id'], 'exist', 'targetRelation' => 'user'],
3838
'message_string' => [['message'], 'string'],
3939
'meta_data_string' => [['meta_data'], 'string', 'min' => 1, 'max' => 300],
4040
'meta_data_default' => [['meta_data'], 'default', 'value' => ''],

tests/specs/blog_v2/models/base/Post.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ public function rules()
3636
'trim' => [['title', 'slug', 'created_at'], 'trim'],
3737
'required' => [['title', 'category_id', 'active'], 'required'],
3838
'category_id_integer' => [['category_id'], 'integer'],
39-
'category_id_exist' => [['category_id'], 'exist', 'targetRelation' => 'Category'],
39+
'category_id_exist' => [['category_id'], 'exist', 'targetRelation' => 'category'],
4040
'created_by_id_integer' => [['created_by_id'], 'integer'],
41-
'created_by_id_exist' => [['created_by_id'], 'exist', 'targetRelation' => 'CreatedBy'],
41+
'created_by_id_exist' => [['created_by_id'], 'exist', 'targetRelation' => 'createdBy'],
4242
'title_unique' => [['title'], 'unique'],
4343
'title_string' => [['title'], 'string', 'max' => 255],
4444
'slug_string' => [['slug'], 'string', 'min' => 1, 'max' => 200],

tests/specs/fk_col_name/app/models/base/Webhook.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ public function rules()
2929
return [
3030
'trim' => [['name'], 'trim'],
3131
'user_id_integer' => [['user_id'], 'integer'],
32-
'user_id_exist' => [['user_id'], 'exist', 'targetRelation' => 'User'],
32+
'user_id_exist' => [['user_id'], 'exist', 'targetRelation' => 'user'],
3333
'redelivery_of_integer' => [['redelivery_of'], 'integer'],
34-
'redelivery_of_exist' => [['redelivery_of'], 'exist', 'targetRelation' => 'RedeliveryOf'],
34+
'redelivery_of_exist' => [['redelivery_of'], 'exist', 'targetRelation' => 'redeliveryOf'],
3535
'name_string' => [['name'], 'string'],
3636
];
3737
}

tests/specs/fk_col_name_index/app/models/base/Webhook.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ public function rules()
3131
return [
3232
'trim' => [['name'], 'trim'],
3333
'user_id_integer' => [['user_id'], 'integer'],
34-
'user_id_exist' => [['user_id'], 'exist', 'targetRelation' => 'User'],
34+
'user_id_exist' => [['user_id'], 'exist', 'targetRelation' => 'user'],
3535
'redelivery_of_integer' => [['redelivery_of'], 'integer'],
36-
'redelivery_of_exist' => [['redelivery_of'], 'exist', 'targetRelation' => 'RedeliveryOf'],
36+
'redelivery_of_exist' => [['redelivery_of'], 'exist', 'targetRelation' => 'redeliveryOf'],
3737
'rd_abc_2_integer' => [['rd_abc_2'], 'integer'],
38-
'rd_abc_2_exist' => [['rd_abc_2'], 'exist', 'targetRelation' => 'Rd2'],
38+
'rd_abc_2_exist' => [['rd_abc_2'], 'exist', 'targetRelation' => 'rd2'],
3939
'user_id_name_unique' => [['user_id', 'name'], 'unique', 'targetAttribute' => [
4040
'user_id',
4141
'name',

tests/specs/issue_fix/159_bug_giiapi_generated_rules_emailid/maria/models/base/Contact.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public function rules()
2929
'trim' => [['nickname'], 'trim'],
3030
'required' => [['mailing_id'], 'required'],
3131
'mailing_id_integer' => [['mailing_id'], 'integer'],
32-
'mailing_id_exist' => [['mailing_id'], 'exist', 'targetRelation' => 'Mailing'],
32+
'mailing_id_exist' => [['mailing_id'], 'exist', 'targetRelation' => 'mailing'],
3333
'active_boolean' => [['active'], 'boolean'],
3434
'active_default' => [['active'], 'default', 'value' => false],
3535
'nickname_string' => [['nickname'], 'string'],

tests/specs/issue_fix/162_bug_dollarref_with_x_faker/app/models/base/Order.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public function rules()
2828
return [
2929
'trim' => [['name', 'name2'], 'trim'],
3030
'invoice_id_integer' => [['invoice_id'], 'integer'],
31-
'invoice_id_exist' => [['invoice_id'], 'exist', 'targetRelation' => 'Invoice'],
31+
'invoice_id_exist' => [['invoice_id'], 'exist', 'targetRelation' => 'invoice'],
3232
'name_string' => [['name'], 'string'],
3333
'name2_string' => [['name2'], 'string'],
3434
];

tests/specs/issue_fix/175_bug_allof_with_multiple_dollarrefs/pgsql/models/base/Contact.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public function rules()
2929
'trim' => [['nickname'], 'trim'],
3030
'required' => [['account_id'], 'required'],
3131
'account_id_integer' => [['account_id'], 'integer'],
32-
'account_id_exist' => [['account_id'], 'exist', 'targetRelation' => 'Account'],
32+
'account_id_exist' => [['account_id'], 'exist', 'targetRelation' => 'account'],
3333
'active_boolean' => [['active'], 'boolean'],
3434
'active_default' => [['active'], 'default', 'value' => false],
3535
'nickname_string' => [['nickname'], 'string'],
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
return [
4+
'openApiPath' => '@specs/issue_fix/29_extension_fk_column_name_cause_error_in_case_of_column_name_without_underscore/index.yaml',
5+
'generateUrls' => false,
6+
'generateModels' => true,
7+
'excludeModels' => [
8+
'Error',
9+
],
10+
'generateControllers' => false,
11+
'generateMigrations' => true,
12+
'generateModelFaker' => true,
13+
];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
openapi: "3.0.0"
2+
info:
3+
version: 1.0.0
4+
title: Extension FK COLUMN NAME cause error in case of column name without underscore \#29
5+
paths:
6+
/:
7+
get:
8+
summary: List
9+
operationId: list
10+
responses:
11+
'200':
12+
description: The information
13+
14+
components:
15+
schemas:
16+
User:
17+
type: object
18+
properties:
19+
id:
20+
type: integer
21+
name:
22+
type: string
23+
Post:
24+
type: object
25+
properties:
26+
id:
27+
type: integer
28+
content:
29+
type: string
30+
user:
31+
allOf:
32+
- $ref: '#/components/schemas/User'
33+
- x-fk-column-name: user
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
/**
4+
* Table for User
5+
*/
6+
class m200000_000000_create_table_users extends \yii\db\Migration
7+
{
8+
public function up()
9+
{
10+
$this->createTable('{{%users}}', [
11+
'id' => $this->primaryKey(),
12+
'name' => $this->text()->null(),
13+
]);
14+
}
15+
16+
public function down()
17+
{
18+
$this->dropTable('{{%users}}');
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
/**
4+
* Table for Post
5+
*/
6+
class m200000_000001_create_table_posts extends \yii\db\Migration
7+
{
8+
public function up()
9+
{
10+
$this->createTable('{{%posts}}', [
11+
'id' => $this->primaryKey(),
12+
'content' => $this->text()->null(),
13+
'user' => $this->integer()->null()->defaultValue(null),
14+
]);
15+
$this->addForeignKey('fk_posts_user_users_id', '{{%posts}}', 'user', '{{%users}}', 'id');
16+
}
17+
18+
public function down()
19+
{
20+
$this->dropForeignKey('fk_posts_user_users_id', '{{%posts}}');
21+
$this->dropTable('{{%posts}}');
22+
}
23+
}

0 commit comments

Comments
 (0)