Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Doctrine] problem z LEFT JOIN
Daniel_K
post 6.12.2010, 00:47:31
Post #1





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 25.11.2010

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


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

Ten post edytował Daniel_K 6.12.2010, 00:50:23
Go to the top of the page
+Quote Post
Zyx
post 6.12.2010, 08:53:17
Post #2





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

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


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.


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
Daniel_K
post 6.12.2010, 11:10:05
Post #3





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 25.11.2010

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


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


Go to the top of the page
+Quote Post
Mephistofeles
post 6.12.2010, 16:03:32
Post #4





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

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


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?
Go to the top of the page
+Quote Post
Daniel_K
post 6.12.2010, 17:04:03
Post #5





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 25.11.2010

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


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…

Ten post edytował Daniel_K 6.12.2010, 17:06:15
Go to the top of the page
+Quote Post
Mephistofeles
post 6.12.2010, 18:04:59
Post #6





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

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


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.
Go to the top of the page
+Quote Post
Daniel_K
post 7.12.2010, 01:07:10
Post #7





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 25.11.2010

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


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

Ten post edytował Daniel_K 7.12.2010, 01:07: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 Wersja Lo-Fi Aktualny czas: 25.04.2024 - 12:32