Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SF2][Symfony2][Doctrine]Artykuły wraz z kategoriami
favik
post
Post #1





Grupa: Zarejestrowani
Postów: 58
Pomógł: 0
Dołączył: 18.05.2010

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
favik
post
Post #3





Grupa: Zarejestrowani
Postów: 58
Pomógł: 0
Dołączył: 18.05.2010

Ostrzeżenie: (0%)
-----


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!

Ten post edytował favik 22.06.2013, 09:31:52
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 18:04