Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [inny][SF2][Symfony2]Przerobienie nativSQL na to z użyciem createQueryBuilder
Forum PHP.pl > Forum > PHP > Frameworki
Geniesis
Witam, mam wydawało by się dosyć prosty problem: chcę pobrać dane z bazy używając dwóch left join'ów, w nativSQLzapytanie wygląda tak:
  1. SELECT p . * , u.username, us . *
  2. FROM `post` p
  3. LEFT JOIN fos_user u ON ( p.post_author_id = u.id )
  4. LEFT JOIN user_setting us ON ( us.user_id = u.id )
  5. WHERE topic_id =1

Sprawdzałem w PhpMyAdmin - dziala dobrze
teraz chcę owe zapytanie napisać za pomocą createQueryBuilder, doszedłem do piewszego left join, całość pobiera poprawnie
  1. $qb->select('p, u.username')
  2. ->from($this->entityPath, 'p')
  3. ->leftJoin('p.postAuthor', 'u', 'WITH', 'p.postAuthor=u.id' )
  4. ->addOrderBy('p.addedDate', 'ASC')
  5. ->where('p.topicId=:id')
  6. ->setParameter('id', $id)
  7. ;

  1. <pre>
  2. array(2) {
  3. [0]=>
  4. array(2) {
  5. [0]=>
  6. string(22) "UserBundle\Entity\Post"
  7. ["username"]=>
  8. string(4) "test"
  9. }
  10. [1]=>
  11. array(2) {
  12. [0]=>
  13. string(22) "UserBundle\Entity\Post"
  14. ["username"]=>
  15. string(4) "test"
  16. }
  17. }
  18. </pre>

jednakże nie wiem jak najlepiej dodać drugiego gdy relacja nie występuje pomiędzy post- user_setting a user-user_setting, po kilku kombinacjach doszedłem do czegoś takiego:
  1. $qb->select('p, u.username, us')
  2. ->from($this->entityPath, 'p')
  3. ->leftJoin('p.postAuthor', 'u', 'WITH', 'p.postAuthor=u.id' )
  4. ->leftJoin('UserBundle\Entity\UserSetting', 'us', 'WITH', 'us.user=u.id' )
  5. ->addOrderBy('p.addedDate', 'ASC')
  6. ->where('p.topicId=:id')
  7. ->setParameter('id', $id)
  8. ;

tylko, że wynikowa tablica zupełnie mnie nie satysfakcjonuje
  1. array(3) {
  2. <pre>
  3. [0]=>
  4. array(1) {
  5. [0]=>
  6. string(22) "UserBundle\Entity\Post"
  7. }
  8. [1]=>
  9. array(2) {
  10. [0]=>
  11. string(29) "UserBundle\Entity\UserSetting"
  12. ["username"]=>
  13. string(4) "test"
  14. }
  15. [2]=>
  16. array(1) {
  17. [0]=>
  18. string(22) "UserBundle\Entity\Post"
  19. }
  20. }
  21. </pre>

Nie chcę pisać specjalnie funkcji w PHP by to jakoś złączyć tak jak powinno wyglądać (chyba, że nie ma innego wyboru).

Czy znajdzie się dobra dusza, która doradzi mi jak to zrobić?
I relacje post.orm:
  1. manyToOne:
  2. topic:
  3. targetEntity: Topic
  4. joinColumn:
  5. name: topic_id
  6. referencedColumnName: id
  7. postAuthor:
  8. targetEntity: User
  9. joinColumn:
  10. name: post_author_id
  11. referencedColumnName: id

user_setting.orm
  1. oneToOne:
  2. user:
  3. targetEntity: User
  4. joinColumn:
  5. name: user_id
  6. referencedColumnName: id
lukaskolista
Nie ogarniam. Po co korzystasz z Doctrine, skoro do takich prostych rzeczy rzeźbisz zapytania? Przestaw myślenie z relacyjnych baz danych na obiekty i wszystko bedzie proste.
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.