[BUG] - nested object argument are not in asked order #7470

Closed
opened 2026-01-22 15:52:06 +01:00 by admin · 1 comment
Owner

Originally created by @eltharin on GitHub (Feb 5, 2025).

Bug Report

there is a bug in nested dto's,

In arguments, the dto's come in last in argument lists after scalar values, and not in the asked order.

Q A
Version 3.3.0

This test currently fails :

   public function testShouldSupportNestedNewOperatorsWithDtoFirst(): void
    {
        $dql = '
            SELECT
                new CmsUserDTO(
                    u.name,
                    e.email,
                    new CmsAddressDTO(
                        a.country,
                        a.city,
                        a.zip,
                        new CmsAddressDTO(
                            a.country,
                            a.city,
                            a.zip
                        )
                    ),
                    555812452
                ) as user,
                u.status,
                u.username as cmsUserUsername
            FROM
                Doctrine\Tests\Models\CMS\CmsUser u
            JOIN
                u.email e
            JOIN
                u.address a
            ORDER BY
                u.name';

        $query  = $this->getEntityManager()->createQuery($dql);
        $result = $query->getResult();

        self::assertCount(3, $result);

        self::assertInstanceOf(CmsUserDTO::class, $result[0]['user']);
        self::assertInstanceOf(CmsUserDTO::class, $result[1]['user']);
        self::assertInstanceOf(CmsUserDTO::class, $result[2]['user']);

        self::assertInstanceOf(CmsAddressDTO::class, $result[0]['user']->address);
        self::assertInstanceOf(CmsAddressDTO::class, $result[1]['user']->address);
        self::assertInstanceOf(CmsAddressDTO::class, $result[2]['user']->address);

        self::assertSame($this->fixtures[0]->name, $result[0]['user']->name);
        self::assertSame($this->fixtures[1]->name, $result[1]['user']->name);
        self::assertSame($this->fixtures[2]->name, $result[2]['user']->name);

        self::assertSame($this->fixtures[0]->email->email, $result[0]['user']->email);
        self::assertSame($this->fixtures[1]->email->email, $result[1]['user']->email);
        self::assertSame($this->fixtures[2]->email->email, $result[2]['user']->email);

        self::assertSame($this->fixtures[0]->address->city, $result[0]['user']->address->city);
        self::assertSame($this->fixtures[1]->address->city, $result[1]['user']->address->city);
        self::assertSame($this->fixtures[2]->address->city, $result[2]['user']->address->city);

        self::assertSame($this->fixtures[0]->address->country, $result[0]['user']->address->country);
        self::assertSame($this->fixtures[1]->address->country, $result[1]['user']->address->country);
        self::assertSame($this->fixtures[2]->address->country, $result[2]['user']->address->country);

        self::assertSame('555812452', $result[0]['user']->phonenumbers);
        self::assertSame('555812452', $result[1]['user']->phonenumbers);
        self::assertSame('555812452', $result[2]['user']->phonenumbers);

        self::assertSame($this->fixtures[0]->status, $result[0]['status']);
        self::assertSame($this->fixtures[1]->status, $result[1]['status']);
        self::assertSame($this->fixtures[2]->status, $result[2]['status']);

        self::assertSame($this->fixtures[0]->username, $result[0]['cmsUserUsername']);
        self::assertSame($this->fixtures[1]->username, $result[1]['cmsUserUsername']);
        self::assertSame($this->fixtures[2]->username, $result[2]['cmsUserUsername']);
    }
Originally created by @eltharin on GitHub (Feb 5, 2025). ### Bug Report there is a bug in nested dto's, In arguments, the dto's come in last in argument lists after scalar values, and not in the asked order. | Q | A |-------------------------------------------- | ------ | Version | 3.3.0 This test currently fails : ```php public function testShouldSupportNestedNewOperatorsWithDtoFirst(): void { $dql = ' SELECT new CmsUserDTO( u.name, e.email, new CmsAddressDTO( a.country, a.city, a.zip, new CmsAddressDTO( a.country, a.city, a.zip ) ), 555812452 ) as user, u.status, u.username as cmsUserUsername FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.email e JOIN u.address a ORDER BY u.name'; $query = $this->getEntityManager()->createQuery($dql); $result = $query->getResult(); self::assertCount(3, $result); self::assertInstanceOf(CmsUserDTO::class, $result[0]['user']); self::assertInstanceOf(CmsUserDTO::class, $result[1]['user']); self::assertInstanceOf(CmsUserDTO::class, $result[2]['user']); self::assertInstanceOf(CmsAddressDTO::class, $result[0]['user']->address); self::assertInstanceOf(CmsAddressDTO::class, $result[1]['user']->address); self::assertInstanceOf(CmsAddressDTO::class, $result[2]['user']->address); self::assertSame($this->fixtures[0]->name, $result[0]['user']->name); self::assertSame($this->fixtures[1]->name, $result[1]['user']->name); self::assertSame($this->fixtures[2]->name, $result[2]['user']->name); self::assertSame($this->fixtures[0]->email->email, $result[0]['user']->email); self::assertSame($this->fixtures[1]->email->email, $result[1]['user']->email); self::assertSame($this->fixtures[2]->email->email, $result[2]['user']->email); self::assertSame($this->fixtures[0]->address->city, $result[0]['user']->address->city); self::assertSame($this->fixtures[1]->address->city, $result[1]['user']->address->city); self::assertSame($this->fixtures[2]->address->city, $result[2]['user']->address->city); self::assertSame($this->fixtures[0]->address->country, $result[0]['user']->address->country); self::assertSame($this->fixtures[1]->address->country, $result[1]['user']->address->country); self::assertSame($this->fixtures[2]->address->country, $result[2]['user']->address->country); self::assertSame('555812452', $result[0]['user']->phonenumbers); self::assertSame('555812452', $result[1]['user']->phonenumbers); self::assertSame('555812452', $result[2]['user']->phonenumbers); self::assertSame($this->fixtures[0]->status, $result[0]['status']); self::assertSame($this->fixtures[1]->status, $result[1]['status']); self::assertSame($this->fixtures[2]->status, $result[2]['status']); self::assertSame($this->fixtures[0]->username, $result[0]['cmsUserUsername']); self::assertSame($this->fixtures[1]->username, $result[1]['cmsUserUsername']); self::assertSame($this->fixtures[2]->username, $result[2]['cmsUserUsername']); } ```
admin closed this issue 2026-01-22 15:52:07 +01:00
Author
Owner

@eltharin commented on GitHub (Feb 5, 2025):

for the moment it's possible to use named arguments to bypass this problem

@eltharin commented on GitHub (Feb 5, 2025): for the moment it's possible to use named arguments to bypass this problem
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: doctrine/archived-orm#7470