Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SF2][Symfony] - problem z pobraniem danych
damianooo
post
Post #1





Grupa: Zarejestrowani
Postów: 496
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


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 ?

Ten post edytował damianooo 3.08.2013, 18:43:43
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
redeemer
post
Post #2





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


Musisz "zjoinować" te tabele, ale później i tak musisz wynik pętlą w PHP "przerobić", aby otrzymać taką postać jaką chcesz.


--------------------
Go to the top of the page
+Quote Post
damianooo
post
Post #3





Grupa: Zarejestrowani
Postów: 496
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


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ę ?

Ten post edytował damianooo 3.08.2013, 23:18:39
Go to the top of the page
+Quote Post
cadavre
post
Post #4





Grupa: Zarejestrowani
Postów: 472
Pomógł: 7
Dołączył: 7.12.2005
Skąd: Gliwice

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


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. : )


--------------------
Silesian PHP User Group - www.spug.pl
Symfony2, OAuth2, budowanie API - masz pytania? Pisz!
Go to the top of the page
+Quote Post
damianooo
post
Post #5





Grupa: Zarejestrowani
Postów: 496
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


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

Ten post edytował damianooo 5.08.2013, 08:48:33
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: 22.08.2025 - 10:07