DDC-1323: Join-Table with Metadata Hydrator: no results on non existing Metadata #1659

Closed
opened 2026-01-22 13:21:26 +01:00 by admin · 2 comments
Owner

Originally created by @doctrinebot on GitHub (Aug 7, 2011).

Originally assigned to: @beberlei on GitHub.

Jira issue originally created by user slam:

Assume you have:

namespace MyEntity;

class User
{
    /*** @Id @Column(type="integer") @GeneratedValue **/
    private $id;

    /****
     * @OneToMany(targetEntity="UserImages", mappedBy="user")
     */
    protected $images;
}

class UserImages
{
    /****
     * @Id
     * @JoinColumn(name="user_id")
     * @ManyToOne(targetEntity="User", inversedBy="images")
     */
    private $user;

    /****
     * @Id
     * @JoinColumn(name="image_id")
     * @OneToOne(targetEntity="Image")
     */
    private $image;

    /****
     * @Column(name="sort_number", type="integer", columnDefinition="int(10) unsigned DEFAULT NULL")
     */
    protected $sortNumber;
}

class Image
{
    /*** @Id @Column(type="integer") @GeneratedValue **/
    private $id;
}

and now you have on the database:

||user_id||
|1|

||image_id||
|1|

||user_id||image_id||sort_number||
|1|1|NULL|

This is a legitimate situation.

Now, if you dqlQuery:

SELECT u, uImages, uImagesFile
FROM MyEntity\User u
    LEFT JOIN u.images uImages
    LEFT JOIN uImages.file uImagesFile

You will obtain, with HYDRATE_SCALAR:

Array
(
    [0] => Array
        (
            [u_id] => 1
            [uImages_sortNumber] =>
            [uImagesFile_id] => 1
        )
)

But, due to the AbstractHydrator::*gatherRowData that do not fill $nonemptyComponents with the key uImages, because the only filled keys are metaColumns, HYDRATE_OBJECT and HYDRATE*ARRAY will fail:

Array
(
    [0] => MyEntity\User
        (
            [id] => 1
            [images] => Array
                (
                )
        )
)
Originally created by @doctrinebot on GitHub (Aug 7, 2011). Originally assigned to: @beberlei on GitHub. Jira issue originally created by user slam: Assume you have: ``` namespace MyEntity; class User { /*** @Id @Column(type="integer") @GeneratedValue **/ private $id; /**** * @OneToMany(targetEntity="UserImages", mappedBy="user") */ protected $images; } class UserImages { /**** * @Id * @JoinColumn(name="user_id") * @ManyToOne(targetEntity="User", inversedBy="images") */ private $user; /**** * @Id * @JoinColumn(name="image_id") * @OneToOne(targetEntity="Image") */ private $image; /**** * @Column(name="sort_number", type="integer", columnDefinition="int(10) unsigned DEFAULT NULL") */ protected $sortNumber; } class Image { /*** @Id @Column(type="integer") @GeneratedValue **/ private $id; } ``` and now you have on the database: ||user_id|| |1| ||image_id|| |1| ||user_id||image_id||sort_number|| |1|1|NULL| This is a legitimate situation. Now, if you dqlQuery: ``` SELECT u, uImages, uImagesFile FROM MyEntity\User u LEFT JOIN u.images uImages LEFT JOIN uImages.file uImagesFile ``` You will obtain, with HYDRATE_SCALAR: ``` Array ( [0] => Array ( [u_id] => 1 [uImages_sortNumber] => [uImagesFile_id] => 1 ) ) ``` But, due to the `AbstractHydrator::*gatherRowData` that do not fill `$nonemptyComponents` with the key `uImages`, because the only filled keys are metaColumns, `HYDRATE_OBJECT` and `HYDRATE*ARRAY` will fail: ``` Array ( [0] => MyEntity\User ( [id] => 1 [images] => Array ( ) ) ) ```
admin added the Bug label 2026-01-22 13:21:26 +01:00
admin closed this issue 2026-01-22 13:21:28 +01:00
Author
Owner

@doctrinebot commented on GitHub (Dec 15, 2011):

Comment created by @beberlei:

This was fixed in http://www.doctrine-project.org/jira/browse/DDC-1515

@doctrinebot commented on GitHub (Dec 15, 2011): Comment created by @beberlei: This was fixed in http://www.doctrine-project.org/jira/browse/[DDC-1515](http://www.doctrine-project.org/jira/browse/DDC-1515)
Author
Owner

@doctrinebot commented on GitHub (Dec 15, 2011):

Issue was closed with resolution "Duplicate"

@doctrinebot commented on GitHub (Dec 15, 2011): Issue was closed with resolution "Duplicate"
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: doctrine/archived-orm#1659