Skip to content

Commit b32a138

Browse files
committed
Inheritance - FK save: Ensure column name is the base one
1 parent 074e7d0 commit b32a138

File tree

1 file changed

+52
-25
lines changed

1 file changed

+52
-25
lines changed

src/Utils/BeanDescriptor.php

Lines changed: 52 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1223,7 +1223,6 @@ private function removeDuplicateIndexes(array $indexes): array
12231223
private function generateFindByDaoCodeForIndex(Index $index, string $beanNamespace, string $beanClassName): ?MethodGenerator
12241224
{
12251225
$columns = $index->getColumns();
1226-
$usedBeans = [];
12271226

12281227
/**
12291228
* The list of elements building this index (expressed as columns or foreign keys)
@@ -1249,42 +1248,26 @@ private function generateFindByDaoCodeForIndex(Index $index, string $beanNamespa
12491248
}
12501249

12511250
$parameters = [];
1252-
//$functionParameters = [];
12531251
$first = true;
12541252
/** @var AbstractBeanPropertyDescriptor $element */
12551253
foreach ($elements as $element) {
12561254
$parameter = new ParameterGenerator(ltrim($element->getSafeVariableName(), '$'));
12571255
if (!$first && !($element->isCompulsory() && $index->isUnique())) {
12581256
$parameterType = '?';
1259-
//$functionParameter = '?';
12601257
} else {
12611258
$parameterType = '';
1262-
//$functionParameter = '';
12631259
}
12641260
$parameterType .= $element->getPhpType();
12651261
$parameter->setType($parameterType);
12661262
if (!$first && !($element->isCompulsory() && $index->isUnique())) {
12671263
$parameter->setDefaultValue(null);
12681264
}
1269-
//$functionParameter .= $element->getPhpType();
1270-
$elementClassName = $element->getClassName();
1271-
if ($elementClassName) {
1272-
$usedBeans[] = $beanNamespace.'\\'.$elementClassName;
1273-
}
1274-
//$functionParameter .= ' '.$element->getVariableName();
12751265
if ($first) {
12761266
$first = false;
1277-
} /*else {
1278-
$functionParameter .= ' = null';
1279-
}*/
1280-
//$functionParameters[] = $functionParameter;
1267+
}
12811268
$parameters[] = $parameter;
12821269
}
12831270

1284-
//$functionParametersString = implode(', ', $functionParameters);
1285-
1286-
$count = 0;
1287-
12881271
$params = [];
12891272
$filterArrayCode = '';
12901273
$commentArguments = [];
@@ -1306,12 +1289,11 @@ private function generateFindByDaoCodeForIndex(Index $index, string $beanNamespa
13061289
} elseif ($element instanceof ObjectBeanPropertyDescriptor) {
13071290
$foreignKey = $element->getForeignKey();
13081291
$columns = SafeFunctions::arrayCombine($foreignKey->getLocalColumns(), $foreignKey->getForeignColumns());
1309-
++$count;
13101292
$foreignTable = $this->schema->getTable($foreignKey->getForeignTableName());
13111293
foreach ($columns as $localColumn => $foreignColumn) {
13121294
// 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.
13131295
$targetedElement = new ScalarBeanPropertyDescriptor($foreignTable, $foreignTable->getColumn($foreignColumn), $this->namingStrategy, $this->annotationParser);
1314-
if ($first || $element->isCompulsory() && $index->isUnique()) {
1296+
if ($first || ($element->isCompulsory() && $index->isUnique())) {
13151297
// First parameter for index is not nullable
13161298
$filterArrayCode .= ' '.var_export($localColumn, true).' => '.$element->getSafeVariableName().'->'.$targetedElement->getGetterName()."(),\n";
13171299
} else {
@@ -1326,9 +1308,6 @@ private function generateFindByDaoCodeForIndex(Index $index, string $beanNamespa
13261308
}
13271309
}
13281310

1329-
//$paramsString = implode("\n", $params);
1330-
1331-
13321311
$methodName = $this->namingStrategy->getFindByIndexMethodName($index, $elements);
13331312

13341313
$method = new MethodGenerator($methodName);
@@ -1408,7 +1387,11 @@ private function generateOnDeleteCode(): ?MethodGenerator
14081387
foreach ($relationships as $relationship) {
14091388
if ($relationship instanceof ObjectBeanPropertyDescriptor) {
14101389
$tdbmFk = ForeignKey::createFromFk($relationship->getForeignKey());
1411-
$code .= '$this->setRef('.var_export($tdbmFk->getCacheKey(), true).', null, '.var_export($this->table->getName(), true).");\n";
1390+
$code .= sprintf(
1391+
"\$this->setRef(%s, null, %s);\n",
1392+
var_export($tdbmFk->getCacheKey(), true),
1393+
var_export($this->table->getName(), true)
1394+
);
14121395
}
14131396
}
14141397

@@ -1607,10 +1590,21 @@ private function generateGetForeignKeys(array $fks): MethodGenerator
16071590

16081591
foreach ($fks as $fk) {
16091592
$tdbmFk = ForeignKey::createFromFk($fk);
1593+
1594+
// Override column name in case of inheritance
1595+
$foreignTableName = $fk->getForeignTableName();
1596+
$foreignColumns = $fk->getUnquotedForeignColumns();
1597+
foreach ($foreignColumns as $key => $foreignColumn) {
1598+
$descriptor = $this->findScalarPropertyDescriptorInTable($foreignTableName, $foreignColumn);
1599+
if ($descriptor instanceof InheritanceReferencePropertyDescriptor) {
1600+
$foreignColumns[$key] = $this->foreignColumnNameInInheritance($descriptor, $foreignColumn);
1601+
}
1602+
}
1603+
16101604
$fkArray[$tdbmFk->getCacheKey()] = [
16111605
ForeignKey::FOREIGN_TABLE => $fk->getForeignTableName(),
16121606
ForeignKey::LOCAL_COLUMNS => $fk->getUnquotedLocalColumns(),
1613-
ForeignKey::FOREIGN_COLUMNS => $fk->getUnquotedForeignColumns(),
1607+
ForeignKey::FOREIGN_COLUMNS => $foreignColumns,
16141608
];
16151609
}
16161610

@@ -1646,6 +1640,39 @@ private function generateGetForeignKeys(array $fks): MethodGenerator
16461640
return $method;
16471641
}
16481642

1643+
private function findScalarPropertyDescriptorInTable(string $tableName, string $columnName): ?ScalarBeanPropertyDescriptor
1644+
{
1645+
$beanDescriptor = $this->registry->getBeanForTableName($tableName);
1646+
foreach ($beanDescriptor->getBeanPropertyDescriptors() as $descriptor) {
1647+
if ($descriptor instanceof ScalarBeanPropertyDescriptor && $descriptor->getColumnName() === $columnName) {
1648+
return $descriptor;
1649+
}
1650+
}
1651+
return null;
1652+
}
1653+
1654+
/**
1655+
* Extract the foreign column name from a InheritanceReferencePropertyDescriptor
1656+
*/
1657+
private function foreignColumnNameInInheritance(InheritanceReferencePropertyDescriptor $descriptor, string $column): string
1658+
{
1659+
$nonReferenceDescriptor = $descriptor->getNonScalarReferencedPropertyDescriptor();
1660+
if ($nonReferenceDescriptor instanceof ScalarBeanPropertyDescriptor) {
1661+
return $nonReferenceDescriptor->getColumnName();
1662+
}
1663+
if ($nonReferenceDescriptor instanceof ObjectBeanPropertyDescriptor) {
1664+
$foreignKey = $nonReferenceDescriptor->getForeignKey();
1665+
$localColumns = $foreignKey->getLocalColumns();
1666+
$foreignColumns = $foreignKey->getForeignColumns();
1667+
foreach ($localColumns as $key => $localColumn) {
1668+
if ($localColumn === $column) {
1669+
return $foreignColumns[$key];
1670+
}
1671+
}
1672+
}
1673+
return $column;
1674+
}
1675+
16491676
/**
16501677
* @param mixed $var
16511678
* @param string $indent

0 commit comments

Comments
 (0)