Skip to content

Commit 5a7bb2e

Browse files
authored
Merge pull request #230 from homersimpsons/fix/deeper_composite_fk
Fix/deeper composite fk
2 parents a20710b + 9d060fc commit 5a7bb2e

File tree

4 files changed

+25
-6
lines changed

4 files changed

+25
-6
lines changed

src/Utils/AbstractBeanPropertyDescriptor.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ abstract public function getPhpType(): string;
6767
*/
6868
public function getParamAnnotation(): ParamTag
6969
{
70-
return new ParamTag($this->getVariableName(), [ $this->getPhpType() ]);
70+
return new ParamTag($this->getSafeVariableName(), [ $this->getPhpType() ]);
7171
}
7272

7373
public function getVariableName(): string

src/Utils/ObjectBeanPropertyDescriptor.php

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -258,14 +258,22 @@ private function getLazySerializeCode(string $propertyAccess): string
258258
$rows = [];
259259
foreach ($this->getForeignKey()->getUnquotedForeignColumns() as $column) {
260260
$descriptor = $this->getBeanPropertyDescriptor($column);
261+
$shouldFlatten = false;
261262
if ($descriptor instanceof InheritanceReferencePropertyDescriptor) {
262263
$descriptor = $descriptor->getNonScalarReferencedPropertyDescriptor();
264+
$shouldFlatten = true;
263265
}
266+
267+
$indexName = ltrim($descriptor->getVariableName(), '$');
268+
$columnGetterName = $descriptor->getGetterName();
264269
if ($descriptor instanceof ObjectBeanPropertyDescriptor) {
265-
$rows[] = trim($descriptor->getLazySerializeCode($propertyAccess), '[]');
270+
if ($shouldFlatten) {
271+
$rows[] = trim($descriptor->getLazySerializeCode($propertyAccess), '[]');
272+
} else {
273+
$lazySerializeCode = $descriptor->getLazySerializeCode("$propertyAccess->$columnGetterName()");
274+
$rows[] = "'$indexName' => $lazySerializeCode";
275+
}
266276
} elseif ($descriptor instanceof ScalarBeanPropertyDescriptor) {
267-
$indexName = ltrim($descriptor->getVariableName(), '$');
268-
$columnGetterName = $descriptor->getGetterName();
269277
$rows[] = "'$indexName' => $propertyAccess->$columnGetterName()";
270278
} else {
271279
throw new TDBMException('PropertyDescriptor of class `' . get_class($descriptor) . '` cannot be serialized.');
@@ -280,6 +288,9 @@ private function getBeanPropertyDescriptor(string $column): AbstractBeanProperty
280288
if ($descriptor instanceof ScalarBeanPropertyDescriptor && $descriptor->getColumnName() === $column) {
281289
return $descriptor;
282290
}
291+
if ($descriptor instanceof ObjectBeanPropertyDescriptor && in_array($column, $descriptor->getForeignKey()->getLocalColumns(), true)) {
292+
return $descriptor;
293+
}
283294
}
284295
throw new TDBMException('PropertyDescriptor for `'.$this->table->getName().'`.`' . $column . '` not found in `' . $this->foreignBeanDescriptor->getTable()->getName() . '`');
285296
}

tests/TDBMAbstractServiceTest.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -458,8 +458,12 @@ private static function initSchema(Connection $connection): void
458458
->column('id')->integer()->primaryKey()->autoIncrement()
459459
->column('base_object_id')->references('base_objects')->unique()->comment('@JsonCollection');
460460

461+
$db->table('composite_fk_target_reference')
462+
->column('id')->integer()->primaryKey()->autoIncrement()
463+
->column('label')->string();
464+
461465
$targetTable = $db->table('composite_fk_target')
462-
->column('id_1')->integer()
466+
->column('id_1')->references('composite_fk_target_reference')
463467
->column('id_2')->integer()
464468
->then()->primaryKey(['id_1', 'id_2']);
465469
$db->table('composite_fk_source')
@@ -800,6 +804,10 @@ private static function initSchema(Connection $connection): void
800804
'person_id' => 1,
801805
'boat_id' => 1,
802806
]);
807+
self::insert($connection, 'composite_fk_target_reference', [
808+
'id' => 1,
809+
'label' => 'test'
810+
]);
803811
self::insert($connection, 'composite_fk_target', [
804812
'id_1' => 1,
805813
'id_2' => 1

tests/TDBMDaoGeneratorTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2165,7 +2165,7 @@ public function testLazyStopRecursionOnCompositeForeignKey(): void
21652165
$compositeFkSourceDao = new CompositeFkSourceDao($this->tdbmService);
21662166
$compositeFkSourceBean = $compositeFkSourceDao->getById(1);
21672167
$json = $compositeFkSourceBean->jsonSerialize(true);
2168-
$this->assertEquals(1, $json['compositeFkTarget']['id1']);
2168+
$this->assertEquals(1, $json['compositeFkTarget']['1']['id']);
21692169
$this->assertEquals(1, $json['compositeFkTarget']['id2']);
21702170
}
21712171

0 commit comments

Comments
 (0)