DDC-1652: ArrayHydrator with composite primary key #2077

Closed
opened 2026-01-22 13:39:46 +01:00 by admin · 6 comments
Owner

Originally created by @doctrinebot on GitHub (Feb 15, 2012).

Originally assigned to: @beberlei on GitHub.

Jira issue originally created by user ghennady:

Hi.

Problem with ArrayHydrator and composite primary key.

Given the following data (PRIMARY KEY (ancestor*id,descendant*id))
||ancestor_id||descendant_id||depth||
|1|1|0|
|1|2|1|

$query = $em->createQuery("SELECT c,d FROM ResourceClosure c JOIN c.descendant d WHERE c.ancestor = 1");

echo 'ObjectHydrator result count = '.count($query->getResult()).PHP_EOL;
echo 'ArrayHydrator result count = '.count($query->getArrayResult()).PHP_EOL;
ObjectHydrator result count = 2 
ArrayHydrator result count = 1 

Expected both counts are equals 2.
In case getArrayResult() in result only first record hydrated, second record are ommited

Below examples model and insertion in db

/****
 * @Entity
 */
class ResourceClosure
{
    /****
     * @Id
     * @ManyToOne(targetEntity="Resource")
     * @JoinColumn(name="ancestor_id", referencedColumnName="id")
     *
     */
    private $ancestor;

    /****
     * @Id
     * @ManyToOne(targetEntity="Resource")
     * @JoinColumn(name="descendant_id", referencedColumnName="id")
     * @var Resource
     */
    private $descendant;

    /****
     * @Column(name="depth", type="integer")
     * @var integer
     */
    private $depth;
}
$resource1 = new Entity\Resource('resource1');
$em->persist($resource1);

$resource2 = new Entity\Resource('resource2');
$em->persist($resource2);

$em->flush();

$closure1 = new Entity\ResourceClosure();
$closure1->setAncestor($resource1)
                ->setDescendant($resource1)
                ->setDepth(0);

$em->persist($closure1);


$closure2= new Entity\ResourceClosure();
$closure2->setAncestor($resource1)
                ->setDescendant($resource2)
                ->setDepth(1);

$em->persist($closure2);


$em->flush();

P.S.
Its work like expected in case entity ResourceClosure has simple primary key.

Originally created by @doctrinebot on GitHub (Feb 15, 2012). Originally assigned to: @beberlei on GitHub. Jira issue originally created by user ghennady: Hi. Problem with ArrayHydrator and composite primary key. Given the following data (PRIMARY KEY (`ancestor*id`,`descendant*id`)) ||ancestor_id||descendant_id||depth|| |1|1|0| |1|2|1| ``` $query = $em->createQuery("SELECT c,d FROM ResourceClosure c JOIN c.descendant d WHERE c.ancestor = 1"); echo 'ObjectHydrator result count = '.count($query->getResult()).PHP_EOL; echo 'ArrayHydrator result count = '.count($query->getArrayResult()).PHP_EOL; ``` ``` ObjectHydrator result count = 2 ArrayHydrator result count = 1 ``` Expected both counts are equals 2. In case getArrayResult() in result only first record hydrated, second record are ommited Below examples model and insertion in db ``` /**** * @Entity */ class ResourceClosure { /**** * @Id * @ManyToOne(targetEntity="Resource") * @JoinColumn(name="ancestor_id", referencedColumnName="id") * */ private $ancestor; /**** * @Id * @ManyToOne(targetEntity="Resource") * @JoinColumn(name="descendant_id", referencedColumnName="id") * @var Resource */ private $descendant; /**** * @Column(name="depth", type="integer") * @var integer */ private $depth; } ``` ``` $resource1 = new Entity\Resource('resource1'); $em->persist($resource1); $resource2 = new Entity\Resource('resource2'); $em->persist($resource2); $em->flush(); $closure1 = new Entity\ResourceClosure(); $closure1->setAncestor($resource1) ->setDescendant($resource1) ->setDepth(0); $em->persist($closure1); $closure2= new Entity\ResourceClosure(); $closure2->setAncestor($resource1) ->setDescendant($resource2) ->setDepth(1); $em->persist($closure2); $em->flush(); ``` P.S. Its work like expected in case entity ResourceClosure has simple primary key.
admin added the Bug label 2026-01-22 13:39:46 +01:00
admin closed this issue 2026-01-22 13:39:47 +01:00
Author
Owner

@doctrinebot commented on GitHub (Feb 20, 2012):

Comment created by @beberlei:

Verified

@doctrinebot commented on GitHub (Feb 20, 2012): Comment created by @beberlei: Verified
Author
Owner

@doctrinebot commented on GitHub (Feb 20, 2012):

Comment created by @beberlei:

@Guilherme - This is because the SQL Walker decides to $addMetaColumns => false here. Why did we add this? This skips all meta columns in Array Results, i don't get what that is good for.

@doctrinebot commented on GitHub (Feb 20, 2012): Comment created by @beberlei: @Guilherme - This is because the SQL Walker decides to $addMetaColumns => false here. Why did we add this? This skips all meta columns in Array Results, i don't get what that is good for.
Author
Owner

@doctrinebot commented on GitHub (Feb 20, 2012):

Comment created by @beberlei:

PR: https://github.com/doctrine/doctrine2/pull/290

Guilherme has to verify this

@doctrinebot commented on GitHub (Feb 20, 2012): Comment created by @beberlei: PR: https://github.com/doctrine/doctrine2/pull/290 Guilherme has to verify this
Author
Owner

@doctrinebot commented on GitHub (Mar 3, 2012):

Comment created by @guilhermeblanco:

Resolved with merge of https://github.com/doctrine/doctrine2/pull/290

@doctrinebot commented on GitHub (Mar 3, 2012): Comment created by @guilhermeblanco: Resolved with merge of https://github.com/doctrine/doctrine2/pull/290
Author
Owner

@doctrinebot commented on GitHub (Mar 3, 2012):

Issue was closed with resolution "Fixed"

@doctrinebot commented on GitHub (Mar 3, 2012): Issue was closed with resolution "Fixed"
Author
Owner

@doctrinebot commented on GitHub (Mar 3, 2012):

Comment created by @beberlei:

Merged back to 2.2, will be in 2.2.1

@doctrinebot commented on GitHub (Mar 3, 2012): Comment created by @beberlei: Merged back to 2.2, will be in 2.2.1
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: doctrine/archived-orm#2077