diff --git a/packages/database/src/Builder/ModelInspector.php b/packages/database/src/Builder/ModelInspector.php index 89db10c89..3a24a044c 100644 --- a/packages/database/src/Builder/ModelInspector.php +++ b/packages/database/src/Builder/ModelInspector.php @@ -582,7 +582,7 @@ public function getSelectFields(): ImmutableArray } } - return $selectFields; + return $selectFields->unique(); } public function resolveRelations(string $relationString, string $parent = '', array $visitedPaths = []): array diff --git a/tests/Integration/Database/ModelInspector/ModelInspectorTest.php b/tests/Integration/Database/ModelInspector/ModelInspectorTest.php index b6c38dd83..0c4bc894f 100644 --- a/tests/Integration/Database/ModelInspector/ModelInspectorTest.php +++ b/tests/Integration/Database/ModelInspector/ModelInspectorTest.php @@ -4,6 +4,7 @@ use Tempest\Database\Casters\DataTransferObjectCaster; use Tempest\Database\IsDatabaseModel; +use Tempest\Database\PrimaryKey; use Tempest\Database\Serializers\DataTransferObjectSerializer; use Tempest\Database\Virtual; use Tempest\Mapper\CastWith; @@ -33,6 +34,35 @@ public function test_serialized_property_is_never_a_relation(): void { $this->assertFalse(inspect(ModelInspectorTestModelWithSerializedDtoProperty::class)->isRelation('dto')); } + + public function test_select_doesnt_contain_duplicate_fields(): void + { + $model = inspect(HasRelatedModelWithId::class); + + $selectedFields = $model->getSelectFields(); + + $this->assertEqualsCanonicalizing( + expected: ['name', 'relation_id'], + actual: $selectedFields->toArray(), + ); + } +} + +final class RelationWithId +{ + public PrimaryKey $id; + + public string $name; +} + +final class HasRelatedModelWithId +{ + public RelationWithId $relation; + + public function __construct( + public string $name, + public int $relation_id, + ) {} } final class ModelInspectorTestDtoForModelWithVirtual