Doctrine - OneToMany relation, all result row doesn't fetch in object

后端 未结 2 1408
难免孤独
难免孤独 2020-12-12 03:46

I try to get all my objects DemandCab with their children object (DecisionCab).

My 2 entities

/**
 * DemandCab.
 *
 * @ORM\\Table()
 * @ORM\\Entity(r         


        
相关标签:
2条回答
  • 2020-12-12 03:55

    I am able to reproduce your issue, but I am not sure if this is your case.

    Anyway, my assumption is that you query the demand Entity joined with decision relation at least once with the help of a query builder. Maybe this is done in your action, in an event listener or somewhere else in your code.

    So you may have something like:

    $qb = $this->getDoctrine()
            ->getRepository(DemandCab::class)->createQueryBuilder("dem");
    $qb->select('dem, dec');
    $qb->leftJoin("dem.decisionsCab", "dec");
    
    $qb->andWhere("dec.decision IS NULL");
    $qb->orderBy("dem.startDate", "DESC");
    
    $results = $qb->getQuery()->getResult(); // <-- the decisionsCab collection is hydrated but filtered
    
    $qb2 = $this->getDoctrine()
            ->getRepository(DemandCab::class)->createQueryBuilder("dem");
    $qb2->select('dem, dec');
    $qb2->leftJoin("dem.decisionsCab", "dec");
    
    $qb2->andWhere("dem.completed = 1");
    $qb2->orderBy("dem.startDate", "DESC");
    
        $q = $qb2->getQuery();
        //$q->setHint(Query::HINT_REFRESH, true);
    
        $results = $q->getResult();
    

    The issue is in Doctrine\ORM\Internal\Hydration\ObjectHydrator, it has the property "initializedCollections" where already initialized collections are kept and the collections are hashed by the parent entity type and the entity itself. Unfortunately in the above case, the heydrator does not understand that the collection is filtered in the 1st query and uses it in the 2nd query in order to avoid rehydration.(github link)

    The solution is to cause the query builder to refresh. Try the code:

    $qb->orderBy("dem.startDate", "DESC");
    $q = $qb->getQuery();
    $q->setHint(Query::HINT_REFRESH, true);    // <-- Tell the hydrator to refresh
    return $q->getResult();
    
    0 讨论(0)
  • 2020-12-12 04:04

    First you have initialize your class with the relation ManyToOne with an ArrayCollection.

    And you don't need any of this 'DemandCabRepository'. All the work is done by Doctrine

    0 讨论(0)
提交回复
热议问题