Skip to content

Commit 15cca14

Browse files
committed
Merge branch '5.1' into 5.1-backport
# Conflicts: # src/Utils/BeanDescriptor.php # src/Utils/ObjectBeanPropertyDescriptor.php
2 parents 8f37326 + cf1e03d commit 15cca14

File tree

5 files changed

+78
-29
lines changed

5 files changed

+78
-29
lines changed

src/OrderByAnalyzer.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ private function analyzeOrderByNoCache(string $orderBy) : array
131131
*/
132132
private function trimDirection(string $sql) : string
133133
{
134-
preg_match('/^(.*)(\s+(DESC|ASC|))*$/Ui', $sql, $matches);
134+
preg_match('/^((.|\n)*)(\s+(DESC|ASC))?$/Ui', $sql, $matches);
135135

136136
return $matches[1];
137137
}

src/Utils/BeanDescriptor.php

Lines changed: 52 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1275,7 +1275,6 @@ private function removeDuplicateIndexes(array $indexes): array
12751275
private function generateFindByDaoCodeForIndex(Index $index, string $beanNamespace, string $beanClassName): ?MethodGenerator
12761276
{
12771277
$columns = $index->getColumns();
1278-
$usedBeans = [];
12791278

12801279
/**
12811280
* The list of elements building this index (expressed as columns or foreign keys)
@@ -1301,42 +1300,26 @@ private function generateFindByDaoCodeForIndex(Index $index, string $beanNamespa
13011300
}
13021301

13031302
$parameters = [];
1304-
//$functionParameters = [];
13051303
$first = true;
13061304
/** @var AbstractBeanPropertyDescriptor $element */
13071305
foreach ($elements as $element) {
13081306
$parameter = new ParameterGenerator(ltrim($element->getSafeVariableName(), '$'));
13091307
if (!$first && !($element->isCompulsory() && $index->isUnique())) {
13101308
$parameterType = '?';
1311-
//$functionParameter = '?';
13121309
} else {
13131310
$parameterType = '';
1314-
//$functionParameter = '';
13151311
}
13161312
$parameterType .= $element->getPhpType();
13171313
$parameter->setType($parameterType);
13181314
if (!$first && !($element->isCompulsory() && $index->isUnique())) {
13191315
$parameter->setDefaultValue(null);
13201316
}
1321-
//$functionParameter .= $element->getPhpType();
1322-
$elementClassName = $element->getClassName();
1323-
if ($elementClassName) {
1324-
$usedBeans[] = $beanNamespace.'\\'.$elementClassName;
1325-
}
1326-
//$functionParameter .= ' '.$element->getVariableName();
13271317
if ($first) {
13281318
$first = false;
1329-
} /*else {
1330-
$functionParameter .= ' = null';
1331-
}*/
1332-
//$functionParameters[] = $functionParameter;
1319+
}
13331320
$parameters[] = $parameter;
13341321
}
13351322

1336-
//$functionParametersString = implode(', ', $functionParameters);
1337-
1338-
$count = 0;
1339-
13401323
$params = [];
13411324
$filterArrayCode = '';
13421325
$commentArguments = [];
@@ -1358,12 +1341,11 @@ private function generateFindByDaoCodeForIndex(Index $index, string $beanNamespa
13581341
} elseif ($element instanceof ObjectBeanPropertyDescriptor) {
13591342
$foreignKey = $element->getForeignKey();
13601343
$columns = SafeFunctions::arrayCombine($foreignKey->getUnquotedLocalColumns(), $foreignKey->getUnquotedForeignColumns());
1361-
++$count;
13621344
$foreignTable = $this->schema->getTable($foreignKey->getForeignTableName());
13631345
foreach ($columns as $localColumn => $foreignColumn) {
13641346
// TODO: a foreign key could point to another foreign key. In this case, there is no getter for the pointed column. We don't support this case.
13651347
$targetedElement = new ScalarBeanPropertyDescriptor($foreignTable, $foreignTable->getColumn($foreignColumn), $this->namingStrategy, $this->annotationParser);
1366-
if ($first || $element->isCompulsory() && $index->isUnique()) {
1348+
if ($first || ($element->isCompulsory() && $index->isUnique())) {
13671349
// First parameter for index is not nullable
13681350
$filterArrayCode .= ' '.var_export($localColumn, true).' => '.$element->getSafeVariableName().'->'.$targetedElement->getGetterName()."(),\n";
13691351
} else {
@@ -1378,9 +1360,6 @@ private function generateFindByDaoCodeForIndex(Index $index, string $beanNamespa
13781360
}
13791361
}
13801362

1381-
//$paramsString = implode("\n", $params);
1382-
1383-
13841363
$methodName = $this->namingStrategy->getFindByIndexMethodName($index, $elements);
13851364

13861365
$method = new MethodGenerator($methodName);
@@ -1459,7 +1438,11 @@ private function generateOnDeleteCode(): ?MethodGenerator
14591438
foreach ($relationships as $relationship) {
14601439
if ($relationship instanceof ObjectBeanPropertyDescriptor) {
14611440
$tdbmFk = ForeignKey::createFromFk($relationship->getForeignKey());
1462-
$code .= '$this->setRef('.var_export($tdbmFk->getCacheKey(), true).', null, '.var_export($this->table->getName(), true).");\n";
1441+
$code .= sprintf(
1442+
"\$this->setRef(%s, null, %s);\n",
1443+
var_export($tdbmFk->getCacheKey(), true),
1444+
var_export($this->table->getName(), true)
1445+
);
14631446
}
14641447
}
14651448

@@ -1678,10 +1661,21 @@ private function generateGetForeignKeys(array $fks): MethodGenerator
16781661

16791662
foreach ($fks as $fk) {
16801663
$tdbmFk = ForeignKey::createFromFk($fk);
1664+
1665+
// Override column name in case of inheritance
1666+
$foreignTableName = $fk->getForeignTableName();
1667+
$foreignColumns = $fk->getUnquotedForeignColumns();
1668+
foreach ($foreignColumns as $key => $foreignColumn) {
1669+
$descriptor = $this->findScalarPropertyDescriptorInTable($foreignTableName, $foreignColumn);
1670+
if ($descriptor instanceof InheritanceReferencePropertyDescriptor) {
1671+
$foreignColumns[$key] = $this->foreignColumnNameInInheritance($descriptor, $foreignColumn);
1672+
}
1673+
}
1674+
16811675
$fkArray[$tdbmFk->getCacheKey()] = [
16821676
ForeignKey::FOREIGN_TABLE => $fk->getForeignTableName(),
16831677
ForeignKey::LOCAL_COLUMNS => $fk->getUnquotedLocalColumns(),
1684-
ForeignKey::FOREIGN_COLUMNS => $fk->getUnquotedForeignColumns(),
1678+
ForeignKey::FOREIGN_COLUMNS => $foreignColumns,
16851679
];
16861680
}
16871681

@@ -1717,6 +1711,39 @@ private function generateGetForeignKeys(array $fks): MethodGenerator
17171711
return $method;
17181712
}
17191713

1714+
private function findScalarPropertyDescriptorInTable(string $tableName, string $columnName): ?ScalarBeanPropertyDescriptor
1715+
{
1716+
$beanDescriptor = $this->registry->getBeanForTableName($tableName);
1717+
foreach ($beanDescriptor->getBeanPropertyDescriptors() as $descriptor) {
1718+
if ($descriptor instanceof ScalarBeanPropertyDescriptor && $descriptor->getColumnName() === $columnName) {
1719+
return $descriptor;
1720+
}
1721+
}
1722+
return null;
1723+
}
1724+
1725+
/**
1726+
* Extract the foreign column name from a InheritanceReferencePropertyDescriptor
1727+
*/
1728+
private function foreignColumnNameInInheritance(InheritanceReferencePropertyDescriptor $descriptor, string $column): string
1729+
{
1730+
$nonReferenceDescriptor = $descriptor->getNonScalarReferencedPropertyDescriptor();
1731+
if ($nonReferenceDescriptor instanceof ScalarBeanPropertyDescriptor) {
1732+
return $nonReferenceDescriptor->getColumnName();
1733+
}
1734+
if ($nonReferenceDescriptor instanceof ObjectBeanPropertyDescriptor) {
1735+
$foreignKey = $nonReferenceDescriptor->getForeignKey();
1736+
$localColumns = $foreignKey->getLocalColumns();
1737+
$foreignColumns = $foreignKey->getForeignColumns();
1738+
foreach ($localColumns as $key => $localColumn) {
1739+
if ($localColumn === $column) {
1740+
return $foreignColumns[$key];
1741+
}
1742+
}
1743+
}
1744+
return $column;
1745+
}
1746+
17201747
/**
17211748
* @param mixed $var
17221749
* @param string $indent

src/Utils/ObjectBeanPropertyDescriptor.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,9 @@ private function getBeanPropertyDescriptor(string $column): AbstractBeanProperty
292292
if ($descriptor instanceof ScalarBeanPropertyDescriptor && $descriptor->getColumnName() === $column) {
293293
return $descriptor;
294294
}
295+
if ($descriptor instanceof ObjectBeanPropertyDescriptor && in_array($column, $descriptor->getForeignKey()->getLocalColumns(), true)) {
296+
return $descriptor;
297+
}
295298
if ($descriptor instanceof ObjectBeanPropertyDescriptor && in_array($column, $descriptor->getForeignKey()->getUnquotedLocalColumns(), true)) {
296299
return $descriptor;
297300
}

tests/TDBMAbstractServiceTest.php

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,10 @@ private static function initSchema(Connection $connection): void
392392
->column('base_object_id')->references('base_objects')->unique()->comment('@JsonCollection');
393393
}
394394

395+
$db->table('composite_fk_target_reference')
396+
->column('id')->integer()->primaryKey()->autoIncrement()
397+
->column('label')->string();
398+
395399
$db->table('composite_fk_target_reference')
396400
->column('id')->integer()->primaryKey()->autoIncrement()
397401
->column('label')->string();
@@ -410,10 +414,10 @@ private static function initSchema(Connection $connection): void
410414
// - `inheritance_agency` have an FK to `inheritance_society.**id_entity**`
411415
// - `inheritance_society` have an FK to `inheritance_entity.**id**`
412416
$db->table('inheritance_entity')
413-
->column('id')->integer()->primaryKey()->autoIncrement();
417+
->column('id')->integer()->primaryKey()->autoIncrement()
418+
->column('name')->string();
414419
$db->table('inheritance_society')
415-
->column('id_entity')->references('inheritance_entity')->primaryKey()
416-
->then();
420+
->column('id_entity')->references('inheritance_entity')->primaryKey();
417421
$db->table('inheritance_agency')
418422
->column('id')->integer()->primaryKey()->autoIncrement()
419423
->column('id_parent_society')->references('inheritance_society');

tests/TDBMDaoGeneratorTest.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@
6464
use TheCodingMachine\TDBM\Test\Dao\Bean\Generated\BoatBaseBean;
6565
use TheCodingMachine\TDBM\Test\Dao\Bean\Generated\FileBaseBean;
6666
use TheCodingMachine\TDBM\Test\Dao\Bean\Generated\UserBaseBean;
67+
use TheCodingMachine\TDBM\Test\Dao\Bean\InheritanceAgencyBean;
68+
use TheCodingMachine\TDBM\Test\Dao\Bean\InheritanceSocietyBean;
6769
use TheCodingMachine\TDBM\Test\Dao\Bean\InheritedObjectBean;
6870
use TheCodingMachine\TDBM\Test\Dao\Bean\NodeBean;
6971
use TheCodingMachine\TDBM\Test\Dao\Bean\PersonBean;
@@ -81,6 +83,8 @@
8183
use TheCodingMachine\TDBM\Test\Dao\DogDao;
8284
use TheCodingMachine\TDBM\Test\Dao\FileDao;
8385
use TheCodingMachine\TDBM\Test\Dao\Generated\UserBaseDao;
86+
use TheCodingMachine\TDBM\Test\Dao\InheritanceAgencyDao;
87+
use TheCodingMachine\TDBM\Test\Dao\InheritanceSocietyDao;
8488
use TheCodingMachine\TDBM\Test\Dao\InheritedObjectDao;
8589
use TheCodingMachine\TDBM\Test\Dao\NodeDao;
8690
use TheCodingMachine\TDBM\Test\Dao\PersonDao;
@@ -2354,4 +2358,15 @@ private function skipOracle()
23542358
$this->markTestSkipped('Not supported in Oracle');
23552359
}
23562360
}
2361+
2362+
public function testInheritanceFkWithDifferentPkName(): void
2363+
{
2364+
$inheritanceSocietyDao = new InheritanceSocietyDao($this->tdbmService);
2365+
$inheritanceAgencyDao = new InheritanceAgencyDao($this->tdbmService);
2366+
$society = new InheritanceSocietyBean('test');
2367+
$inheritanceSocietyDao->save($society);
2368+
$this->assertNotNull($society->getId());
2369+
$agency = new InheritanceAgencyBean($society);
2370+
$inheritanceAgencyDao->save($agency);
2371+
}
23572372
}

0 commit comments

Comments
 (0)