Problém s Doctrine join rubrika: Programování: PHP

3 jan_4
položil/-a 15.1.2015

Zdravím,

mám problém s tím, jak dostat z Doctrine správný výsledky při join tabulky. Postupoval jsem podle tohoto: http://stackoverflow.com/questions/15087933/how-to-do-left-join-in-doctrine

Tady je moje query:

$qb = $this->getEntityManager()->createQueryBuilder();
    $qb
        ->select('a', 'u')
        ->from('Application\Entity\Event', 'a')
        ->leftJoin(
            'Application\Entity\Venue',
            'u',
            \Doctrine\ORM\Query\Expr\Join::WITH,
            'a.venue_id = u.id'
        )
        ->orderBy('a.event_datetime', 'DESC');
 
    var_dump($qb->getQuery()->getResult());

Tady výsledek:

array (size=4)
0 => 
object(Application\Entity\Event)[483]
  protected 'id' => int 8
  protected 'artist_id' => int 4
  protected 'venue_id' => int 1246
  protected 'name' => string 'Vlasta Redl' (length=11)
1 => 
object(Application\Entity\Venue)[477]
  protected 'id' => int 1246
  protected 'name' => string 'Malostranská beseda' (length=20)
  ...
2 => 
object(Application\Entity\Event)[468]
  protected 'id' => int 7
  protected 'artist_id' => int 3
  protected 'venue_id' => int 761
  protected 'name' => string 'Positive Mind' (length=13)
 
3 => 
object(Application\Entity\Venue)[485]
  protected 'id' => int 761
  protected 'name' => string 'Divadlo pod lampou' (length=18)
  ....

Takže dostanu pole, kde se po sobě opakují různé objekty. S tim se sice dá pracovat, ale ideální to neni. Nehledě na to že ten výsledek by měl být jiný.

A tady to co bych čekal:

array(
    array(
        0 => Event
        1 => Venue,
    ),
    array(
        0 => Event
        1 => Venue,
    ),
    // ...
)

Nevíte co dělám blbě?

Díky
H.

edit.

Výsledek po užití \Doctrine\ORM\Query::HYDRATE_SCALAR:

0 => 
    array (size=18)
      'a_id' => int 8
      'a_artist_id' => int 4
      'a_venue_id' => int 1246
      'a_name' => string 'Vlasta Redl' (length=11)
      'a_event_datetime' => 
        object(DateTime)[470]
          public 'date' => string '2015-01-09 13:51:36.000000' (length=26)
          public 'timezone_type' => int 3
          public 'timezone' => string 'Europe/Prague' (length=13)
      'u_id' => int 1246
      'u_name' => string 'Malostranská beseda' (length=20)

etc...

Teď z toho mam pole a jsem bez objektů, tzn. že nemůžu volat metody na entitách, ty klíče jsou změněný, atd..

odkaz
4 joker806
odpověděl/-a 16.1.2015

Nevím, jak vypadají entity, ale předpokládám, že tu anonymní vazbu v query používáš proto, že nemáš nadefinovanou relaci přímo na entitě. A právě ta anonymní vazba způsobuje, že ve výsledku máš ty dvojice objektů - Doctrine je nedokáže provázat a tak je vrátí zvlášť.

Popsané je to tady: http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-que.... Popisují to jako aby si moh načítat i scalary, které nejsou definované na entitách (agregace apod.), ale v podstatě se to vztahuje na všechny data, který nejsou přímo přístupný z entity (jak jsme psal výše, chybí jasně definovaná vazba mezi Event a Venue).

Pro zobrazení všech 3 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.