Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions src/generator/default/dbmodel.php
Original file line number Diff line number Diff line change
Expand Up @@ -146,14 +146,16 @@ public function get<?= $relation->getCamelName() ?>()
<?php endif;?>
}
<?php endforeach; ?>
<?php $i = 1; $usedRelationNames = [];
foreach ($model->belongsToRelations as $relationName => $relation): ?><?php $number = in_array($relation->getCamelName(), $usedRelationNames) ? $i : '' ?>
<?php $usedRelationNames = [];
foreach ($model->belongsToRelations as $relationName => $relation): ?><?php

$i = in_array($relation->getCamelName(), $usedRelationNames) ? array_count_values($usedRelationNames)[$relation->getCamelName()]+1 : 1 ?>

# belongs to relation
public function get<?= $relation->getCamelName() . ($number) ?>()
public function get<?= $relation->getCamelName() . ($i === 1 ? '' : $i) ?>()
{
return $this-><?= $relation->getMethod() ?>(\<?= trim($relationNamespace, '\\') ?>\<?= $relation->getClassName() ?>::class, <?php
echo $relation->linkToString() ?>);
}
<?php $i++; $usedRelationNames[] = $relation->getCamelName(); endforeach; ?>
<?php $usedRelationNames[] = $relation->getCamelName(); endforeach; ?>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

return [
'openApiPath' => '@specs/issue_fix/100_fix_numbering_issue_in_relation_names_in_case_of_more_than_one_similar_belongs_to_relation/index.yml',
'generateUrls' => false,
'generateModels' => true,
'excludeModels' => [
'Error',
],
'generateControllers' => false,
'generateMigrations' => false,
'generateModelFaker' => false,
];
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
openapi: "3.0.0"
info:
version: 1.0.0
title: 100_fix_numbering_issue_in_relation_names_in_case_of_more_than_one_similar_belongs_to_relation
paths:
/:
get:
summary: List
operationId: list
responses:
'200':
description: The information

components:
schemas:
Address:
type: object
properties:
id:
type: integer
shortName:
type: string
postCode:
type: string
maxLength: 64
Foo:
type: object
properties:
id:
type: integer
address:
$ref: '#/components/schemas/Address'

Bar:
type: object
properties:
id:
type: integer
address:
$ref: '#/components/schemas/Address'
related_address:
$ref: '#/components/schemas/Address'
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace app\models;

class Address extends \app\models\base\Address
{


}

Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace app\models;

class Bar extends \app\models\base\Bar
{


}

Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace app\models;

class Foo extends \app\models\base\Foo
{


}

Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<?php

/**
* This file is generated by Gii, do not change manually!
*/

namespace app\models\base;

/**
* This is the model class for table "addresses".
*
* @property int $id
* @property string $shortName
* @property string $postCode
*
*/
abstract class Address extends \yii\db\ActiveRecord
{
public static function tableName()
{
return '{{%addresses}}';
}

public function rules()
{
return [
'trim' => [['shortName', 'postCode'], 'trim'],
'shortName_string' => [['shortName'], 'string'],
'postCode_string' => [['postCode'], 'string', 'max' => 64],
];
}

# belongs to relation
public function getFoo()
{
return $this->hasOne(\app\models\Foo::class, ['address_id' => 'id']);
}

# belongs to relation
public function getBar()
{
return $this->hasOne(\app\models\Bar::class, ['address_id' => 'id']);
}

# belongs to relation
public function getBar2()
{
return $this->hasOne(\app\models\Bar::class, ['related_address_id' => 'id']);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php

/**
* This file is generated by Gii, do not change manually!
*/

namespace app\models\base;

/**
* This is the model class for table "bars".
*
* @property int $id
* @property int $address_id
* @property int $related_address_id
*
* @property \app\models\Address $address
* @property \app\models\Address $relatedAddress
*/
abstract class Bar extends \yii\db\ActiveRecord
{
public static function tableName()
{
return '{{%bars}}';
}

public function rules()
{
return [
'address_id_integer' => [['address_id'], 'integer'],
'address_id_exist' => [['address_id'], 'exist', 'targetRelation' => 'address'],
'related_address_id_integer' => [['related_address_id'], 'integer'],
'related_address_id_exist' => [['related_address_id'], 'exist', 'targetRelation' => 'relatedAddress'],
];
}

public function getAddress()
{
return $this->hasOne(\app\models\Address::class, ['id' => 'address_id']);
}

public function getRelatedAddress()
{
return $this->hasOne(\app\models\Address::class, ['id' => 'related_address_id']);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

/**
* This file is generated by Gii, do not change manually!
*/

namespace app\models\base;

/**
* This is the model class for table "foos".
*
* @property int $id
* @property int $address_id
*
* @property \app\models\Address $address
*/
abstract class Foo extends \yii\db\ActiveRecord
{
public static function tableName()
{
return '{{%foos}}';
}

public function rules()
{
return [
'address_id_integer' => [['address_id'], 'integer'],
'address_id_exist' => [['address_id'], 'exist', 'targetRelation' => 'address'],
];
}

public function getAddress()
{
return $this->hasOne(\app\models\Address::class, ['id' => 'address_id']);
}
}
24 changes: 24 additions & 0 deletions tests/unit/issues/Issue100Test.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

namespace tests\unit\issues;

use tests\DbTestCase;
use Yii;
use yii\helpers\FileHelper;

class Issue100Test extends DbTestCase
{
// https://github.com/php-openapi/yii2-openapi/issues/100
public function testFixNumberingIssueInRelationNamesInCaseOfMoreThanOneSimilarBelongsToRelation()
{
$testFile = Yii::getAlias("@specs/issue_fix/100_fix_numbering_issue_in_relation_names_in_case_of_more_than_one_similar_belongs_to_relation/index.php");
$this->runGenerator($testFile);
$actualFiles = FileHelper::findFiles(Yii::getAlias('@app'), [
'recursive' => true,
]);
$expectedFiles = FileHelper::findFiles(Yii::getAlias("@specs/issue_fix/100_fix_numbering_issue_in_relation_names_in_case_of_more_than_one_similar_belongs_to_relation/mysql"), [
'recursive' => true,
]);
$this->checkFiles($actualFiles, $expectedFiles);
}
}