2015-08-26 27 views
6

Mam relację wiele do wielu, a kiedy ładuję obiekt, który jest po jednej stronie tej relacji, spodziewam się widzieć jej własność ArrayCollection powiązanych podmiotów po drugiej stronie. Jednak tak się nie dzieje - załadowana ArrayCollection nie zawiera żadnych elementów, podczas gdy w bazie danych widzę odpowiednie wpisy. Jaki mógł być powód?Symfony2: Doctrine nie ładuje powiązanych obiektów w relacjach wiele do wielu.

Oto mój kod:
Jedna strona relacji, ConsolidatedReport klasa:

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

Inną stroną stosunku, klasa reakcji:

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

Oto funkcja biegnę do uzyskać instancję ConsolidatedReport. Funkcja ta znajduje się wewnątrz usługi, która jest wywołana z pojemnikiem:

/** 
* 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; 
}' 

w bazie danych, istnieje „con_rprt_responses” stół z dwoma kolumnami „consolidated_reports_id” i „RESPONSE_ID”. Jednak w profilera nie widzę żadnych zapytań do tej tabeli.

Co może pójść nie tak?

UPDATE: Proszę zobaczyć moją odpowiedź na to pytanie poniżej, że pracował dla mnie.

+0

W profilu, nie widzę żadnych zapytań do tabeli "con_rpt_responses". – Vasily802

Odpowiedz

5

dodałem fetch="EAGER" do właściwości $ Odpowiedzi klasy ConsolidatedReport, i to działało.

Kod wygląda teraz tak:

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

Więcej informacji tutaj: http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-objects.html#by-eager-loading

Jeszcze jeśli ktoś wie, dlaczego zbiór podmiotem powiązanym nie ładować bez wyraźnego określenia EAGER sprowadzanie - proszę podzielić twoja wiedza, jest bardzo ceniona!

+0

Mam taki sam problem z relacją jeden do wielu, i 'fetch =" EAGER "' rozwiązało to też. To bardzo dziwne. Czy kiedykolwiek zastanawiałeś się, dlaczego wymagane jest szybkie pobieranie? –

0

Jeśli określisz joinColumns, czy to rozwiąże twój problem?

/** 
* @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

nie, to nie jest – Vasily802

0

Własne właściwości * toMany należy zainicjować za pomocą kolekcji ArrayCollection.

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

tak, to jest określone – Vasily802

0

W przypadku gdy masz więcej niż jednym zapytaniu aby pobrać te same obiekty przy użyciu Doctrine spróbuje użyć:

$entityManager->clear(); 

pomiędzy nimi, aby rozwiązać „brakujących” podmioty. To nie jest rozwiązanie "takie jakie jest", ale może dać ci pojęcie czegoś złego w łańcuchu twoich zapytań.