@@ -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
0 commit comments