2015-08-26 15 views
6

Ho una relazione molti-a-molti, e quando carico un'entità che è da un lato questa relazione, mi aspetto di vedere come sua proprietà l'ArrayCollection di entità correlate su un altro lato. Tuttavia, questo non accade - l'ArrayCollection caricato non ha elementi in esso, mentre nel database posso vedere le voci correlate. Quale potrebbe essere la ragione?Symfony2: Doctrine non carica le entità correlate in relazione molti-a-molti

Ecco il mio codice:
Un lato del rapporto, classe ConsolidatedReport:

/** 
* @var ArrayCollection 
* 
* @ORM\ManyToMany(targetEntity="P24\Response", inversedBy="consolidatedReports") 
* @ORM\JoinTable(name="con_rprt_responses") 
*/ 
private $responses; 

Un altro lato del rapporto, classe Response:

/** 
* @var ArrayCollection 
* 
* @ORM\ManyToMany(targetEntity="P24\ConsolidatedReport\ConsolidatedReport", mappedBy="responses") 
*/ 
private $consolidatedReports; 

Ecco la funzione corro a ottenere un'istanza di ConsolidatedReport. Questa funzione trova all'interno di un servizio che viene chiamato dal contenitore:

/** 
* Picks the consolidated report with given id. 
* 
* @param string $id 
* 
* @return ConsolidatedReport 
* 
* @throws NonExistentConsolidatedReportException if the survey doesn't exist 
*/ 
public function pick($id) 
{ 
    $report = $this->repository->findOneBy(array('id' => $id)); 

    if (!$report) { 
     throw new NonExistentConsolidatedReportException($id); 
    } 

    return $report; 
}' 

Nel database, c'è tabella "con_rprt_responses" con due colonne "consolidated_reports_id" e "RESPONSE_ID". Tuttavia, nel profiler non vedo alcuna query per quella tabella.

Cosa potrebbe andare storto qui?

UPDATE: Si prega di vedere la mia risposta a questa domanda di seguito, che ha funzionato per me.

+0

Nel profiler, non vedo alcuna query sulla tabella "con_rpt_responses". – Vasily802

risposta

5

ho aggiunto fetch="EAGER" alla proprietà $ Risposte di classe ConsolidatedReport, e ha funzionato.

Il codice appare come segue:

/** 
* @var ArrayCollection 
* 
* @ORM\ManyToMany(targetEntity="P24\Response", inversedBy="consolidatedReports", fetch="EAGER") 
* @ORM\JoinTable(name="con_rprt_responses") 
*/ 
private $responses; 

Maggiori informazioni qui: http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-objects.html#by-eager-loading

Ancora se qualcuno conosce il motivo per cui la raccolta di entità correlata non sarebbe caricare senza specificare esplicitamente il recupero EAGER - si prega di condividere la tua conoscenza, è molto apprezzata!

+0

Ho lo stesso problema con una relazione uno-a-molti, e 'fetch =" EAGER "' ha risolto anche questo. È molto strano Hai mai capito perché è stato richiesto il recupero ansioso? –

0

Se si specifica joinColumns, questo risolve il problema?

/** 
* @ORM\ManyToMany(targetEntity="P24\Response", inversedBy="consolidatedReports") 
* @ORM\JoinTable(name="con_rprt_responses", 
* joinColumns={@ORM\JoinColumn(name="consolidated_reports_id", referencedColumnName="id")}, 
* inverseJoinColumns={@ORM\JoinColumn(name="response_id", referencedColumnName="id")} 
*) 
*/ 
+0

no, non è – Vasily802

0

Le proprietà * toMany devono essere inizializzate con ArrayCollection.

public function __construct() { 
    $this->responses = new \Doctrine\Common\Collections\ArrayCollection(); 
    $this-> consolidatedReports = new \Doctrine\Common\Collections\ArrayCollection(); 
} 
+0

sì, questo è specificato – Vasily802

0

Nel caso in cui si dispone di più poi singola query per andare a prendere gli stessi oggetti utilizzando Dottrina tenta di utilizzare:

$entityManager->clear(); 

in mezzo, per fissare entità "mancanti". Non è una soluzione "così com'è", tuttavia può darti un'idea di qualcosa di sbagliato nella catena delle tue domande.

Problemi correlati