DQL NEW Operator to support PHP 8.x named arguments. #6872

Closed
opened 2026-01-22 15:40:28 +01:00 by admin · 3 comments
Owner

Originally created by @acirulis on GitHub (Nov 9, 2021).

Feature Request

Q A
New Feature yes
RFC no
BC Break no

Summary

Would it be possible for DQL NEW operator (https://www.doctrine-project.org/projects/doctrine-orm/en/2.10/reference/dql-doctrine-query-language.html#new-operator-syntax) to support PHP 8.0 named arguments (https://stitcher.io/blog/php-8-named-arguments) additionally to regular positional ones? As far as I see, DQL NEW() syntax is great for transforming Doctrine results to DTO objects but only drawback is use of positional arguments, which can be easily mixed up in the long-term (human error). Named arguments would fix that.

Consider class:

class BookDTO
{
    public function __construct(
        public int $id,
        public string $title,
        public int $publish_year,
    ) { }
}

Current DQL:

$query = $em->createQuery('SELECT NEW BookDTO(b.id, b.name, b.publish_year) FROM Book b');

Proposed DQL:

$query = $em->createQuery('SELECT NEW BookDTO(id: b.id, name: b.name, publish_year: b.publish_year) FROM Book b');

Originally created by @acirulis on GitHub (Nov 9, 2021). ### Feature Request | Q | A |------------ | ------ | New Feature | yes | RFC | no | BC Break | no #### Summary Would it be possible for DQL NEW operator (https://www.doctrine-project.org/projects/doctrine-orm/en/2.10/reference/dql-doctrine-query-language.html#new-operator-syntax) to support PHP 8.0 named arguments (https://stitcher.io/blog/php-8-named-arguments) additionally to regular positional ones? As far as I see, DQL NEW() syntax is great for transforming Doctrine results to DTO objects but only drawback is use of positional arguments, which can be easily mixed up in the long-term (human error). Named arguments would fix that. Consider class: ``` class BookDTO { public function __construct( public int $id, public string $title, public int $publish_year, ) { } } ``` Current DQL: `$query = $em->createQuery('SELECT NEW BookDTO(b.id, b.name, b.publish_year) FROM Book b');` Proposed DQL: `$query = $em->createQuery('SELECT NEW BookDTO(id: b.id, name: b.name, publish_year: b.publish_year) FROM Book b');`
admin closed this issue 2026-01-22 15:40:28 +01:00
Author
Owner

@acirulis commented on GitHub (Nov 30, 2021):

Short update: I`ve found since that DQL NEW keyword has limitations ("Note that you can only pass scalar expressions to the constructor.") and figured better following approach for instantiating DTOs with array_map():

        $queryBuilder
            ->select('p', 'c')
            ->from(Person::class, 'p')
            ->leftJoin('p.contacts', 'c');

        return array_map(
            function (array $result) {
                return CustomerDto::createFromArray($result);
            },
            $queryBuilder->getQuery()->getArrayResult()
        );
@acirulis commented on GitHub (Nov 30, 2021): Short update: I`ve found since that DQL NEW keyword has limitations ("Note that you can only pass scalar expressions to the constructor.") and figured better following approach for instantiating DTOs with array_map(): ``` $queryBuilder ->select('p', 'c') ->from(Person::class, 'p') ->leftJoin('p.contacts', 'c'); return array_map( function (array $result) { return CustomerDto::createFromArray($result); }, $queryBuilder->getQuery()->getArrayResult() ); ```
Author
Owner

@kimhemsoe commented on GitHub (Nov 13, 2024):

"Fixed" by https://github.com/doctrine/orm/pull/11575 as it was decided not to go with php8 styled named arguments?

@kimhemsoe commented on GitHub (Nov 13, 2024): "Fixed" by https://github.com/doctrine/orm/pull/11575 as it was decided not to go with php8 styled named arguments?
Author
Owner

@greg0ire commented on GitHub (Nov 13, 2024):

That and also there is an alternate syntax closer to SQL that should address the issue (although the issue was not clearly worded in the first place, only the desired solution).

@greg0ire commented on GitHub (Nov 13, 2024): That and also there is an alternate syntax closer to SQL that should address the issue (although the issue was not clearly worded in the first place, only the desired solution).
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: doctrine/archived-orm#6872