Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Doctrine] problem z LEFT JOIN
Forum PHP.pl > Forum > Gotowe rozwiązania > Skrypty obsługi baz danych
Daniel_K
Witam, zaczynam przygodę z Doctrine i mam problem z Joinami. Mam taki fragment bazy:



w modelu wyciągam dane za pomocą:

  1. public static function getUnselectedService($status)
  2. {
  3. return Doctrine_Core::getTable('Service')
  4. ->createQuery('a')
  5. ->where('a.add_date < NOW()')
  6. ->leftJoin('a.ServiceStatusToService b ON a.id_status = b.id_status')
  7. ->andWhere('b.name = ?', $status)
  8. ->leftJoin('a.UserToService c ON a.id_user = c.id_user')
  9. ->leftJoin('c.UserToRank d ON c.id_user = d.id_user') // <- TEN JOIN POWODUJE BŁĄD
  10. ->execute();
  11. }


Schamat wyglada tak:

  1. User:
  2. columns:
  3. Id_user:
  4. type: integer
  5. notnull: true
  6. primary: true
  7. autoincrement: true
  8. relations:
  9. Status:
  10. foreignAlias: User1
  11. local: Id_status
  12. foreign: Id_status
  13. Services1:
  14. type: meny
  15. class: Service
  16. local: Id_user
  17. foreign: Id_user
  18. foreignAlias: UserToService
  19. Rank1:
  20. type: meny
  21. class: Rank
  22. local: Id_user
  23. foreign: Id_user
  24. foreignAlias: UserToRank
  25.  
  26. Rank:
  27. columns:
  28. Id_user:
  29. type: integer
  30. notnull: true
  31. relations:
  32.  
  33. Service:
  34. columns:
  35. Id_service:
  36. type: integer
  37. notnull: true
  38. primary: true
  39. autoincrement: true
  40. Id_category:
  41. type: integer
  42. notnull: true
  43. Id_status:
  44. type: integer
  45. notnull: true
  46. Id_user:
  47. type: integer
  48. notnull: true
  49. relations:
  50.  
  51. Service_status:
  52. columns:
  53. Id_status:
  54. type: integer
  55. notnull: true
  56. primary: true
  57. autoincrement: true
  58. Name:
  59. type: string(20)
  60. relations:
  61. Services:
  62. type: meny
  63. class: Service
  64. local: Id_status
  65. foreign: Id_status
  66. foreignAlias: ServiceStatusToService


Problem jest taki ze ostatni JOIN wywala mi błąd, nie wiem co jest nie tak. Czy mogę liczyć na jakąś pomoc? Korzystam z symfony 1.4

Pozdrawiam
Zyx
Popatrz sobie dokładniej, do czego odnosi się alias wpisany w niedziałającej relacji, a później zerknij na schemat, gdzie ta relacja jest tak naprawdę zdefiniowana.
Daniel_K
Dzięki za zmuszenie do myślenia pomogło smile.gif

Mam jeszcze takie pytanie, chodź to nieodpowiedni dział ale może się uda. Od kilku dni poznaje symfony i mam pewien dylemat, w sytuacji kiedy chcę zrobić małą modyfikację bazy np. jednej tabeli, po naniesieniu zmian w schema.yml i wydaniu komendy „symfony doctrine:build –all” wszystkie dotychczasowe dane w bazie są usuwane. Czy istnieje jakiś sposób aby nanosić lekkie modyfikacje struktury bazy bez usuwania wszystkich danych?

Coś nadal jest nie tak ;/ W sumie nie wywala błędu ale zamiast w wartości mam informacje "No description for object of class "Rank"

Tak pobieram dane:
  1. (...)
  2. foreach ($recommend as $key => $iterProfil)
  3. {
  4. $listRecommend .= $iterProfil['UserToService']['RankToUser']['Id_user'];
  5. }
  6. (...)


Mephistofeles
W standardowych joinach nie musisz wpisywać ON, Doctrine samo dobiera relacje.

Sposób na dane nazywa się fixtures, robisz wtedy build --all --and-load.

Poza tym:
Cytat
type: meny

Raczej many. Zajrzyj do dokumentacji Doctrine, poczytaj o schema w Yamlu, bo sporo ustawień wpisujesz niepotrzebnie, choćby primary keye, które normalnie się same ustawiają i nie warto ich zmieniać dopóki naprawdę nie trzeba, tak samo jakbyś relacje podpiął z drugiej strony nie musiałbyś wpisywać typu wiele.
Dziwnie nazywasz te relacje, imho nieintuicyjnie. Nie lepiej jest nazwać np. User->Services, Service->Users, Rank->Users / User->Rank, zamiast UserToService?

[/php]['RankToUser']['Id_user'];[/php]
Po co pobierasz relację rangi, żeby tylko dostać się do id usera?
Daniel_K
Co do fixtures… fajne do danych testowych, ale co w sytuacji kiedy wypuszczam serwis w wersji podstawowej, on sobie tak żyje, posiada kilku użytkowników… a ja równolegle chce go rozwijać?
Co do nazywania to zostało mi z obiektówki w innym języku smile.gif Ale zgadzam się Twój sposób jest bardziej intuicyjny.
Jeśli chodzi o:
  1. ['RankToUser']['Id_user'];

Powinno być:
  1. ['RankToUser']['value_rank'];

value_rank jest rekordem w tabeli Rank, który przechowuje mi ocenę użytkownika. Tyle że jak się do niego odwołuje w powyższy sposób to wywala mi "No description for object of class "Rank", nie mam pojęcia co jest nie tak…
Mephistofeles
Wtedy użyj migracji, ale nie powinno się używać danych rzeczywistych do testów.
No description... problem prawdopodobnie leży w braku __toString, ale czemu ją wywołuje to nie wiem.
Daniel_K
Ok dałem __toString() dzięki czemu nie wyświetla informacji "No description for object of class "Rank", lecz nadal nie czyta danych z bazy... ;/


__toString() ustawilem w lib/model/doctrine/Rank.class.php

  1. public function __toString()
  2. {
  3. return sprintf('%d', $this->getValue_rank());
  4. }



juz brak pomysłu... zaznaczam że w bazie są dane... Proszę o pomoc
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-2024 Invision Power Services, Inc.