Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF2][Symfony2][Doctrine]Artykuły wraz z kategoriami
Forum PHP.pl > Forum > PHP > Frameworki
favik
Witam,
chcę pobrać listę artykułów wraz z przypisanymi do nich kategoriami. Tabele połączone są relacją wiele do wielu. Jednak:

  1. $query = $em->createQueryBuilder()
  2. ->select('a')
  3. ->from('MYSiteBundle:Article', 'a')
  4. ->innerJoin('a.channels', 'c')
  5. ->where('c.slug = :slug')
  6. ->setParameter('slug', $slug)
  7. ->getQuery();

Generuje następnie bardzo dużo zapytań przy wyświetlaniu (dodatkowe do każdego artykułu).



  1. $query = $em->createQueryBuilder()
  2. ->select('a', 'c')
  3. ->from('MYSiteBundle:Article', 'a')
  4. ->innerJoin('a.channels', 'c')
  5. ->where('c.slug = :slug')
  6. ->setParameter('slug', $slug)
  7. ->getQuery();

Pobiera tylko kategorie, którą aktualnie przeglądam podaną w $slug, a nie wszystkie do których przydzielony jest artykuł.


Czy da się to zrobić jednym zapytaniem?
Crozin
Pierwsze zapytanie pobiera jedynie dane dotyczące artykułu (select(a)), stąd chcąc wyświetlić kategorie każdego z nich konieczne jest wykonanie nowego zapytania. Drugie zapytanie pobiera artykuł oraz wyłącznie jedną kategorię (where(c.slug = :slug)). Ciebie natomiast interesuje pobranie wszystkich artykułów i powiązanych z nimi kategorii, gdzie artykuł posiada powiązanie z daną kategorią:
  1. SELECT a, c FROM Article a INNER JOIN a.channels c WHERE :channel MEMBER OF a.channels
Parametr :channel to obiekt całej kategorii/kanału, tak więc najpierw powinieneś pobrać ten obiekt na podstawie parametru slug.
favik
Teraz w ogóle nie zwraca rekordów.
  1. $channel = $em->getRepository('MYSiteBundle:Channel')->findOneBySlug($slug);
  2.  
  3. $query = $em->createQueryBuilder()
  4. ->select('a', 'c')
  5. ->from('MYSiteBundle:Article', 'a')
  6. ->innerJoin('a.channels', 'c')
  7. ->where(':channel MEMBER OF a.channels')
  8. ->setParameter('channel', $channel)
  9. ->getQuery();


Może w entity powinno być coś jeszcze ustawione?


//edit

zamiast całego obiektu podałem jego ID i działa tak jak chciałem. Dzięki smile.gif!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.