Skip to content

Commit 888f281

Browse files
authored
Merge pull request #154 from homersimpsons/fix/singular-getter-one-to-one
OneToOne inverse relation: singular getter name
2 parents b5ff431 + 9bc925f commit 888f281

File tree

3 files changed

+37
-20
lines changed

3 files changed

+37
-20
lines changed

src/Utils/DirectForeignKeyMethodDescriptor.php

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,9 @@ public function __construct(
7474
public function getName() : string
7575
{
7676
if (!$this->useAlternateName) {
77-
return 'get'.TDBMDaoGenerator::toCamelCase($this->foreignKey->getLocalTableName());
77+
return 'get' . $this->getPropertyName();
7878
} else {
79-
$methodName = 'get'.TDBMDaoGenerator::toCamelCase($this->foreignKey->getLocalTableName()).'By';
79+
$methodName = 'get' . $this->getPropertyName() . 'By';
8080

8181
$camelizedColumns = array_map([TDBMDaoGenerator::class, 'toCamelCase'], $this->foreignKey->getUnquotedLocalColumns());
8282

@@ -86,6 +86,20 @@ public function getName() : string
8686
}
8787
}
8888

89+
/**
90+
* Returns the property name in CamelCase taking into account singularization
91+
*
92+
* @return string
93+
*/
94+
private function getPropertyName() : string
95+
{
96+
$name = $this->foreignKey->getLocalTableName();
97+
if ($this->hasLocalUniqueIndex()) {
98+
$name = TDBMDaoGenerator::toSingular($name);
99+
}
100+
return TDBMDaoGenerator::toCamelCase($name);
101+
}
102+
89103
/**
90104
* Returns the name of the class that will be returned by the getter (short name).
91105
*
@@ -170,22 +184,28 @@ private function getFilters(ForeignKeyConstraint $fk) : string
170184
return $parametersCode;
171185
}
172186

187+
private $hasLocalUniqueIndex;
173188
/**
174189
* Check if the ForeignKey have an unique index
175190
*
176191
* @return bool
177192
*/
178193
private function hasLocalUniqueIndex(): bool
179194
{
195+
if ($this->hasLocalUniqueIndex !== null) {
196+
return $this->hasLocalUniqueIndex;
197+
}
180198
foreach ($this->getForeignKey()->getLocalTable()->getIndexes() as $index) {
181199
if (
182200
$index->isUnique()
183201
&& count($index->getUnquotedColumns()) === count($this->getForeignKey()->getUnquotedLocalColumns())
184202
&& !array_diff($index->getUnquotedColumns(), $this->getForeignKey()->getUnquotedLocalColumns()) // Check for permuted columns too
185203
) {
204+
$this->hasLocalUniqueIndex = true;
186205
return true;
187206
}
188207
}
208+
$this->hasLocalUniqueIndex = false;
189209
return false;
190210
}
191211

@@ -222,7 +242,7 @@ public function getJsonSerializeCode() : string
222242
$format = "jsonSerialize($stopRecursion)";
223243
}
224244
$isIncluded = $this->findAnnotation(Annotation\JsonInclude::class) !== null;
225-
$index = $jsonCollection->key ?: lcfirst(TDBMDaoGenerator::toCamelCase($this->foreignKey->getLocalTableName()));
245+
$index = $jsonCollection->key ?: lcfirst($this->getPropertyName());
226246
$class = $this->getBeanClassName();
227247
$variableName = '$' . TDBMDaoGenerator::toVariableName($class);
228248
$getter = $this->getName();

tests/TDBMAbstractServiceTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -437,12 +437,12 @@ private static function initSchema(Connection $connection): void
437437
->column('track_id')->references('tracks')
438438
->column('artist_id')->references('artists')->comment('@JsonKey("feat") @JsonInclude');
439439

440-
$db->table('object_base')
440+
$db->table('base_objects')
441441
->column('id')->integer()->primaryKey()->autoIncrement()
442442
->column('label')->string();
443-
$db->table('object_inherited')
443+
$db->table('inherited_objects')
444444
->column('id')->integer()->primaryKey()->autoIncrement()
445-
->column('object_base_id')->references('object_base')->unique()->comment('@JsonCollection');
445+
->column('base_object_id')->references('base_objects')->unique()->comment('@JsonCollection');
446446

447447
$sqlStmts = $toSchema->getMigrateFromSql($fromSchema, $connection->getDatabasePlatform());
448448

tests/TDBMDaoGeneratorTest.php

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -40,27 +40,26 @@
4040
use TheCodingMachine\TDBM\Test\Dao\AllNullableDao;
4141
use TheCodingMachine\TDBM\Test\Dao\AnimalDao;
4242
use TheCodingMachine\TDBM\Test\Dao\ArtistDao;
43+
use TheCodingMachine\TDBM\Test\Dao\BaseObjectDao;
4344
use TheCodingMachine\TDBM\Test\Dao\Bean\AccountBean;
4445
use TheCodingMachine\TDBM\Test\Dao\Bean\AllNullableBean;
4546
use TheCodingMachine\TDBM\Test\Dao\Bean\AnimalBean;
46-
use TheCodingMachine\TDBM\Test\Dao\Bean\ArrayBean;
4747
use TheCodingMachine\TDBM\Test\Dao\Bean\Article2Bean;
4848
use TheCodingMachine\TDBM\Test\Dao\Bean\ArticleBean;
4949
use TheCodingMachine\TDBM\Test\Dao\Bean\ArtistBean;
50+
use TheCodingMachine\TDBM\Test\Dao\Bean\BaseObjectBean;
5051
use TheCodingMachine\TDBM\Test\Dao\Bean\BoatBean;
5152
use TheCodingMachine\TDBM\Test\Dao\Bean\CatBean;
5253
use TheCodingMachine\TDBM\Test\Dao\Bean\CategoryBean;
5354
use TheCodingMachine\TDBM\Test\Dao\Bean\CountryBean;
54-
use TheCodingMachine\TDBM\Test\Dao\Bean\DateArrayBean;
5555
use TheCodingMachine\TDBM\Test\Dao\Bean\DogBean;
5656
use TheCodingMachine\TDBM\Test\Dao\Bean\FileBean;
5757
use TheCodingMachine\TDBM\Test\Dao\Bean\Generated\ArticleBaseBean;
5858
use TheCodingMachine\TDBM\Test\Dao\Bean\Generated\BoatBaseBean;
5959
use TheCodingMachine\TDBM\Test\Dao\Bean\Generated\FileBaseBean;
6060
use TheCodingMachine\TDBM\Test\Dao\Bean\Generated\UserBaseBean;
61+
use TheCodingMachine\TDBM\Test\Dao\Bean\InheritedObjectBean;
6162
use TheCodingMachine\TDBM\Test\Dao\Bean\NodeBean;
62-
use TheCodingMachine\TDBM\Test\Dao\Bean\ObjectBaseBean;
63-
use TheCodingMachine\TDBM\Test\Dao\Bean\ObjectInheritedBean;
6463
use TheCodingMachine\TDBM\Test\Dao\Bean\PersonBean;
6564
use TheCodingMachine\TDBM\Test\Dao\Bean\RefNoPrimKeyBean;
6665
use TheCodingMachine\TDBM\Test\Dao\Bean\RoleBean;
@@ -73,11 +72,9 @@
7372
use TheCodingMachine\TDBM\Test\Dao\CountryDao;
7473
use TheCodingMachine\TDBM\Test\Dao\DogDao;
7574
use TheCodingMachine\TDBM\Test\Dao\FileDao;
76-
use TheCodingMachine\TDBM\Test\Dao\Generated\ContactBaseDao;
7775
use TheCodingMachine\TDBM\Test\Dao\Generated\UserBaseDao;
76+
use TheCodingMachine\TDBM\Test\Dao\InheritedObjectDao;
7877
use TheCodingMachine\TDBM\Test\Dao\NodeDao;
79-
use TheCodingMachine\TDBM\Test\Dao\ObjectBaseDao;
80-
use TheCodingMachine\TDBM\Test\Dao\ObjectInheritedDao;
8178
use TheCodingMachine\TDBM\Test\Dao\RefNoPrimKeyDao;
8279
use TheCodingMachine\TDBM\Test\Dao\RoleDao;
8380
use TheCodingMachine\TDBM\Test\Dao\StateDao;
@@ -2098,14 +2095,14 @@ public function testLazyLoad(): void
20982095
*/
20992096
public function testOneToOneInverseRelationGetter(): void
21002097
{
2101-
$objectBaseDao = new ObjectBaseDao($this->tdbmService);
2102-
$objectInheritedDao = new ObjectInheritedDao($this->tdbmService);
2103-
$objectBase = new ObjectBaseBean('label');
2098+
$objectBaseDao = new BaseObjectDao($this->tdbmService);
2099+
$objectInheritedDao = new InheritedObjectDao($this->tdbmService);
2100+
$objectBase = new BaseObjectBean('label');
21042101
$objectBaseDao->save($objectBase);
2105-
$this->assertNull($objectBase->getObjectInherited());
2106-
$objectInherited = new ObjectInheritedBean($objectBase);
2102+
$this->assertNull($objectBase->getInheritedObject());
2103+
$objectInherited = new InheritedObjectBean($objectBase);
21072104
$objectInheritedDao->save($objectInherited);
2108-
$this->assertSame($objectInherited, $objectBase->getObjectInherited());
2109-
$this->assertEquals(1, $objectBase->jsonSerialize()['objectInherited']['id']);
2105+
$this->assertSame($objectInherited, $objectBase->getInheritedObject());
2106+
$this->assertEquals(1, $objectBase->jsonSerialize()['inheritedObject']['id']);
21102107
}
21112108
}

0 commit comments

Comments
 (0)