diff --git a/src/Utils/AbstractBeanPropertyDescriptor.php b/src/Utils/AbstractBeanPropertyDescriptor.php index c8e559c3..3c949905 100644 --- a/src/Utils/AbstractBeanPropertyDescriptor.php +++ b/src/Utils/AbstractBeanPropertyDescriptor.php @@ -67,7 +67,7 @@ abstract public function getPhpType(): string; */ public function getParamAnnotation(): ParamTag { - return new ParamTag($this->getVariableName(), [ $this->getPhpType() ]); + return new ParamTag($this->getSafeVariableName(), [ $this->getPhpType() ]); } public function getVariableName(): string diff --git a/src/Utils/ObjectBeanPropertyDescriptor.php b/src/Utils/ObjectBeanPropertyDescriptor.php index 8a14be67..c5ac455b 100644 --- a/src/Utils/ObjectBeanPropertyDescriptor.php +++ b/src/Utils/ObjectBeanPropertyDescriptor.php @@ -258,14 +258,22 @@ private function getLazySerializeCode(string $propertyAccess): string $rows = []; foreach ($this->getForeignKey()->getUnquotedForeignColumns() as $column) { $descriptor = $this->getBeanPropertyDescriptor($column); + $shouldFlatten = false; if ($descriptor instanceof InheritanceReferencePropertyDescriptor) { $descriptor = $descriptor->getNonScalarReferencedPropertyDescriptor(); + $shouldFlatten = true; } + + $indexName = ltrim($descriptor->getVariableName(), '$'); + $columnGetterName = $descriptor->getGetterName(); if ($descriptor instanceof ObjectBeanPropertyDescriptor) { - $rows[] = trim($descriptor->getLazySerializeCode($propertyAccess), '[]'); + if ($shouldFlatten) { + $rows[] = trim($descriptor->getLazySerializeCode($propertyAccess), '[]'); + } else { + $lazySerializeCode = $descriptor->getLazySerializeCode("$propertyAccess->$columnGetterName()"); + $rows[] = "'$indexName' => $lazySerializeCode"; + } } elseif ($descriptor instanceof ScalarBeanPropertyDescriptor) { - $indexName = ltrim($descriptor->getVariableName(), '$'); - $columnGetterName = $descriptor->getGetterName(); $rows[] = "'$indexName' => $propertyAccess->$columnGetterName()"; } else { throw new TDBMException('PropertyDescriptor of class `' . get_class($descriptor) . '` cannot be serialized.'); @@ -280,6 +288,9 @@ private function getBeanPropertyDescriptor(string $column): AbstractBeanProperty if ($descriptor instanceof ScalarBeanPropertyDescriptor && $descriptor->getColumnName() === $column) { return $descriptor; } + if ($descriptor instanceof ObjectBeanPropertyDescriptor && in_array($column, $descriptor->getForeignKey()->getLocalColumns(), true)) { + return $descriptor; + } } throw new TDBMException('PropertyDescriptor for `'.$this->table->getName().'`.`' . $column . '` not found in `' . $this->foreignBeanDescriptor->getTable()->getName() . '`'); } diff --git a/tests/TDBMAbstractServiceTest.php b/tests/TDBMAbstractServiceTest.php index 97608fda..60cdcdfb 100644 --- a/tests/TDBMAbstractServiceTest.php +++ b/tests/TDBMAbstractServiceTest.php @@ -458,8 +458,12 @@ private static function initSchema(Connection $connection): void ->column('id')->integer()->primaryKey()->autoIncrement() ->column('base_object_id')->references('base_objects')->unique()->comment('@JsonCollection'); + $db->table('composite_fk_target_reference') + ->column('id')->integer()->primaryKey()->autoIncrement() + ->column('label')->string(); + $targetTable = $db->table('composite_fk_target') - ->column('id_1')->integer() + ->column('id_1')->references('composite_fk_target_reference') ->column('id_2')->integer() ->then()->primaryKey(['id_1', 'id_2']); $db->table('composite_fk_source') @@ -800,6 +804,10 @@ private static function initSchema(Connection $connection): void 'person_id' => 1, 'boat_id' => 1, ]); + self::insert($connection, 'composite_fk_target_reference', [ + 'id' => 1, + 'label' => 'test' + ]); self::insert($connection, 'composite_fk_target', [ 'id_1' => 1, 'id_2' => 1 diff --git a/tests/TDBMDaoGeneratorTest.php b/tests/TDBMDaoGeneratorTest.php index c4bc19f2..1d18f56c 100644 --- a/tests/TDBMDaoGeneratorTest.php +++ b/tests/TDBMDaoGeneratorTest.php @@ -2165,7 +2165,7 @@ public function testLazyStopRecursionOnCompositeForeignKey(): void $compositeFkSourceDao = new CompositeFkSourceDao($this->tdbmService); $compositeFkSourceBean = $compositeFkSourceDao->getById(1); $json = $compositeFkSourceBean->jsonSerialize(true); - $this->assertEquals(1, $json['compositeFkTarget']['id1']); + $this->assertEquals(1, $json['compositeFkTarget']['1']['id']); $this->assertEquals(1, $json['compositeFkTarget']['id2']); }