2017-05-17 3 views
1

est ici un expert de la doctrine, qui peut m'expliquer, pourquoi ces DQL n'initialiseront pas tallyRevs sur l'entité Tally? J'ai supposé que lorsque j'appellerai TallyRevs (côté propriétaire) et l'entité fetchJoin Tally, le champ tallyRevs sera initialisé. Qu'est-ce que je fais mal? J'ai besoin de sélectionner TallyRev en fonction de certains critères via DQL et comme il s'agit d'une association bidirectionnelle, je voudrais qu'il soit initialisé de l'autre côté (Tally.tallyRevs) aussi.Doctrine2, DQL, association non initialisée

Screen of dump

<?php 


/** 
* @ORM\Entity 
* @ORM\Table(name="v3_overview_calloff_tally") 
*/ 
class Tally 
{ 

    /** 
    * @var int 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var TallyRev[]|Collection 
    * @ORM\OneToMany(targetEntity="STI\Model\Entity\V3\Overview\CallOff\TallyRev", mappedBy="tally") 
    */ 
    private $tallyRevs; 
} 


/** 
* @ORM\Entity 
* @ORM\Table(name="v3_overview_calloff_tallyrev") 
*/ 
class TallyRev 
{ 

    /** 
    * @var int 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var int 
    * @ORM\Column(type="integer", nullable=false) 
    */ 
    private $revision; 

    /** 
    * @var Tally 
    * @ORM\ManyToOne(targetEntity="STI\Model\Entity\V3\Overview\CallOff\Tally", inversedBy="tallyRevs") 
    * @ORM\JoinColumn(name="tally_id", referencedColumnName="id", nullable=false) 
    */ 
    private $tally; 
} 

Voici un code référentiel:

$qb = $repository->createQueryBuilder(); 
$qb 
    ->select('tallyRev') 
    ->from(TallyRev::class, 'tallyRev', 'tallyRev.id') 
    // complicated filtering, this is just an example 
    ->andWhere($qb->expr()->in('tallyRev.revision', ':rev')) 
    ->setParameter('rev', $rev) 
; 
$tallyRevs = $qb->getQuery()->getResult(); 

$ids = array_keys($tallyRevs); 

$qb2 = $repository->createQueryBuilder(); 
$qb2 
    ->select('partial tallyRev.{id}') 
    ->from(TallyRev::class, 'tallyRev', 'tallyRev.id') 
    ->andWhere($qb2->expr()->in('tallyRev.id', ':ids')) 
    ->setParameter('ids', $ids) 
    ->leftJoin('tallyRev.tally', 'tally') 
    ->addSelect('tally') 
; 
$qb2->getQuery()->getResult(); 

Je sais que je peux écrire DQL du côté Tally comme ceci:

$qb 
    ->select('tally') 
    ->from(Tally::class, 'tally', 'tally.id') 
    ->leftJoin('tally.tallyRev', 'tallyRev') 
    ->addSelect('tallyRev') 
    ->andWhere($qb->expr()->in('tallyRev.revision', ':rev')) 
    ->setParameter('rev', $revs) 
; 

Répondre

0

Si vous voulez pour aller chercher tally lorsque vous récupérez tallyRev vous devriez écrire quelque chose comme ça dans le premier qb, et de lete qb2

->select(['tallyRev', 'tally']) 
->from(TallyRev::class, 'tallyRev', 'tallyRev.id') 
->join('tallyRev.tally', 'tally') 
// complicated filtering, this is just an example 
->andWhere($qb->expr()->in('tallyRev.revision', ':rev')) 
->setParameter('rev', $rev) 

;