Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF2][Symfony] - problem z pobraniem danych
Forum PHP.pl > Forum > PHP > Frameworki
damianooo
Witam.

Mam następujące pytanie.

Mam dwie tabele:

Author i Books . Author jest w relacji "jeden do wielu" z Book (Autor może mieć wiele książek)

Chciałbym uzyskać tablicę wielowymiarową gdzie indeksy to będą author_id natomiast wartością będzie tablica z book_id , danego autora.

Coś takiego:

  1. $authorsBooks = array(
  2. 2 => array(23,24,25,26),
  3. 5 => array(31,32,33,34),
  4. 10 => array(41,42,43,44),
  5. itd.
  6. );


Jak pobrać książki dla każdego autora jednym zapytaniem żeby uzyskać taką tablicę jak powyżej ? Próbowałem to zrobić za pomocą QueryBuildera ale niewychodzi ?
redeemer
Musisz "zjoinować" te tabele, ale później i tak musisz wynik pętlą w PHP "przerobić", aby otrzymać taką postać jaką chcesz.
damianooo
ok, zjoinowałem i mam tak w query builderze:

  1. public function myTest()
  2. {
  3. $query = $this->getEntityManager()
  4. ->createQuery('
  5. SELECT u.id as uid,b.id as bid
  6. FROM My\Test\Entity\Book b
  7. JOIN b.user u
  8. ');
  9. return $query->getArrayResult();
  10. }


Natomiast w Kontrolerze tak:
  1. $ddd = $em->getRepository('MyTestBundle:Book')->myTest();


Jak teraz zgrupować te wyniki aby wynik był taki jak oczekuję ?
cadavre
SQL nie zwraca wielowymiarowych tablic z wynikami, więc bezpośrednio takiej formy nie otrzymasz.

  1. SELECT IDENTITY(u) as uid, IDENTITY(b) as bid
  2. FROM My\Test\Entity\Book b
  3. JOIN b.user u
  4. ORDER BY uid


Dalej w PHP w pętli:

  1. // Zakładając, że wyniki mamy w $results
  2. $output = array();
  3. foreach($results as $row) {
  4. $output[$row['uid']][] = $row['bid']
  5. }


W takim wypadku wykonujesz query z hydracją scalar a nie array.
(http://docs.doctrine-project.org/en/latest/reference/dql-doctrine-query-language.html#hydration-modes)

Mam nadzieję, że nic nie pomieszałem - pisane z głowy. : )
damianooo
Wielkie dzięki ... działa pięknie tak jak napisałeś ten przykład. U mnie to będzie tak:

W BookRepository:

  1. public function myTest()
  2. {
  3. $query = $this->getEntityManager()
  4. ->createQuery('
  5. SELECT u.id as uid, b.id as bid
  6. FROM My\TestBundle\Entity\Book b
  7. JOIN b.user u
  8. ');
  9. return $query->getResult();
  10. }


natomiast w kontrolerze tak:

  1. $ddd = $em->getRepository('MyTestBundle:Book)->myTest();
  2. $output = array();
  3. foreach ($ddd as $row) {
  4. $output[$row['uid']][] = $row['bid'];
  5. }



Jeśli chodzi o tą opcję HYDRATION_SCALAR to próbowałem z tym ale wywala błąd:

  1. Fatal error: Class 'My\TestBundle\Entity\Query' not found in /var/www/test/src/My/TestBundle/Entity/BookRepository.php on line 60


Pewnie trzeba dodać odpowiednią przestrzeń nazw. Jednak tak bardzo na razie tego nie potrzebuję. Dzięki jednak za podpowiedź, że jest taka opcja. (trzeba więcej dokumentacje czytać smile.gif ) . Na pewno kiedyś wykorzystam tą opcję.

Dzięki, Pozdrawiam
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.