Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Propel] Tabela i dwa razy join
mike
post 18.03.2007, 20:11:47
Post #1





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Mam taką sytuację: tabela Client zawierająca pole company_id, jest to klucz obcy z tabeli Company, która to z kolei zawiera pole address_id będące kluczem do tabeli Address.
Wygląda to mniej więcej tak:
  1. CREATE TABLE client
  2. (
  3. id serial NOT NULL,
  4. "login" character varying(50) NOT NULL,
  5. "password" character(40) NOT NULL,
  6. first_name character varying(50),
  7. last_name character varying(50),
  8. max_receivers integer NOT NULL,
  9. max_cargos integer NOT NULL,
  10. invoices_avaliable integer NOT NULL,
  11. balance integer,
  12. client_type_id integer,
  13. company_id integer,
  14. CONSTRAINT client_pkey PRIMARY KEY (id),
  15. CONSTRAINT client_client_type_id_fkey FOREIGN KEY (client_type_id)
  16. REFERENCES client_type (id) MATCH SIMPLE
  17. ON UPDATE NO ACTION ON DELETE NO ACTION,
  18. CONSTRAINT client_company_id_fkey FOREIGN KEY (company_id)
  19. REFERENCES company (id) MATCH SIMPLE
  20. ON UPDATE NO ACTION ON DELETE NO ACTION,
  21. CONSTRAINT client_login_key UNIQUE ("login")
  22. )
  1. CREATE TABLE company
  2. (
  3. id serial NOT NULL,
  4. name character varying(100) NOT NULL,
  5. nip character varying(13) NOT NULL,
  6. phone character varying(50),
  7. regon character varying(15),
  8. address_id integer,
  9. CONSTRAINT company_pkey PRIMARY KEY (id),
  10. CONSTRAINT company_address_id_fkey FOREIGN KEY (address_id)
  11. REFERENCES address (id) MATCH SIMPLE
  12. ON UPDATE NO ACTION ON DELETE NO ACTION
  13. )
  1. CREATE TABLE address
  2. (
  3. id serial NOT NULL,
  4. "local" character varying(10) NOT NULL,
  5. building character varying(10) NOT NULL,
  6. street character varying(100) NOT NULL,
  7. city character varying(50) NOT NULL,
  8. post_code character varying(6) NOT NULL,
  9. country character varying(50) NOT NULL,
  10. CONSTRAINT address_pkey PRIMARY KEY (id)
  11. )

Chciałbym teraz za pomocą Propela wydobyć w jednym wyniku (w jednym zapytaniu) dane o kliencie, firmie i adresie.
Na chwilę obecną mam:
  1. <?php
  2.  
  3. $criteria = new Criteria();
  4. $criteria->add(ClientPeer::ID, $clientId);
  5. $users = ClientPeer::doSelectJoinAllExceptClientType($criteria);
  6.  
  7. ?>
daje mi to:
  1. SELECT client.ID, client.LOGIN, client.PASSWORD, client.FIRST_NAME, client.LAST_NAME, client.MAX_RECEIVERS, client.MAX_CARGOS, client.INVOICES_AVALIABLE, client.BALANCE, client.CLIENT_TYPE_ID, client.COMPANY_ID, company.ID, company.NAME, company.NIP, company.PHONE, company.REGON, company.ADDRESS_ID FROM client, company WHERE client.ID=11 AND client.COMPANY_ID=company.ID
czyli nie to czego oczekuję.
Próbowałem już chyba wszystkie kombinacje zarówno z Criteria::add() jak i z Criteria::addJoin()

Jeżeli ktoś wie jak to zrobić będę wdzięczny za informację.

Dla ścisłości chciałbym mieć to:
  1. SELECT * FROM client JOIN company ON client.company_id = company.id
  2. JOIN address ON company.address_id = address.id
  3. WHERE client.id = 11


Ten post edytował mike_mech 18.03.2007, 20:31:57
Go to the top of the page
+Quote Post
galileox86
post 4.10.2007, 21:46:39
Post #2





Grupa: Zarejestrowani
Postów: 59
Pomógł: 9
Dołączył: 16.06.2007
Skąd: Bytom

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


Witam ktoś może wie jak rozwiązac ten problem questionmark.gif Bo mam podobny problem


--------------------
Odpowiedziałem? Pewnie streamuję http://livecoding.tv/galileoprime.

Chcesz abym odpowiedział właśnie na Twoje pytanie? Napisz do mnie wiadomość prywatną, prócz odpowiedzi możesz zobaczyć jak rozwiązuję Twój problem.
Go to the top of the page
+Quote Post
tomeksobczak
post 5.10.2007, 07:57:39
Post #3





Grupa: Zarejestrowani
Postów: 139
Pomógł: 10
Dołączył: 6.07.2007
Skąd: opole

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


  1. <?php
  2. $c = new Criteria();
  3. $c->add(ClientPeer::ID, $client_id);
  4. $c->addJoin(ClientPeer::COMPANY_ID, CompanyPeer::ID);
  5. $c->addJoin(CompanyPeer::ADDRESS_ID , AddressPeer::ID);
  6.  
  7. $joinHelper = new sfPropelCustomJoinHelper('Client');
  8. $joinHelper->addSelectTables('Client', 'Company', 'Address');
  9. $joinHelper->setHas('Client', 'Company');
  10. $joinHelper->setHas('Company', 'Address');
  11. $result = $joinHelper->doSelect($c);
  12. ?>


to powinno pomoc


--------------------
Go to the top of the page
+Quote Post
galileox86
post 5.10.2007, 15:21:56
Post #4





Grupa: Zarejestrowani
Postów: 59
Pomógł: 9
Dołączył: 16.06.2007
Skąd: Bytom

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


ktos mi wyjasni czym jest ta klasa questionmark.gif sfPropelCustomJoinHelper . w API dokumentacji jej nie ma w pluginach tez czegos takiego nie ma a symfony mi pisze ze nie ma takiej klasy


--------------------
Odpowiedziałem? Pewnie streamuję http://livecoding.tv/galileoprime.

Chcesz abym odpowiedział właśnie na Twoje pytanie? Napisz do mnie wiadomość prywatną, prócz odpowiedzi możesz zobaczyć jak rozwiązuję Twój problem.
Go to the top of the page
+Quote Post
tomeksobczak
post 5.10.2007, 16:57:20
Post #5





Grupa: Zarejestrowani
Postów: 139
Pomógł: 10
Dołączył: 6.07.2007
Skąd: opole

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


http://trac.symfony-project.com/wiki/Apply...oinsUsingHelper


--------------------
Go to the top of the page
+Quote Post
galileox86
post 7.10.2007, 10:38:56
Post #6





Grupa: Zarejestrowani
Postów: 59
Pomógł: 9
Dołączył: 16.06.2007
Skąd: Bytom

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


Kurcze powoli dostaje do glowy z tym propelem ;/. Mam kolejny problem
  1. <?php
  2. public static function pobierzTerminarzPoSezonie($idSezonu){
  3. $c = new Criteria();
  4. $c->add(SezonyPeer::ID,$idSezonu);
  5. $criterion = $c->getNewCriterion(WynikiPeer::WYSCIG_POZYCJA,1);
  6. $criterion -> addOr(WynikiPeer::ID,Criteria::ISNULL);
  7. $c->add($criterion);
  8. $c->addJoin(SezonyPeer::ID,WyscigiPeer::SEZON_ID,'left outer JOIN');
  9. $c->addJoin(WyscigiPeer::ID,WynikiPeer::WYSCIG_ID,'left outer JOIN');
  10. $c->addJoin(WyscigiPeer::TOR_ID,ToryPeer::ID,'left outer JOIN');
  11. $c->addJoin(WynikiPeer::KIEROWCA_ID,KierowcyPeer::ID,'left outer JOIN');
  12.  
  13. // Instead of calling ArticlePeer, we use a sfPropelCustomJoinHelper class
  14. $joinHelper = new sfPropelCustomJoinHelper('Sezony');
  15.  
  16. // Tell the joiner to select fields from the following tables
  17. $joinHelper->addSelectTables('Wyscigi', 'Wyniki','Kierowcy','Tory');
  18.  
  19. // Set up the relatoinship betweeen Book and Category.
  20. $joinHelper->setHas('Sezon', 'Wyscigi');
  21. $joinHelper->setHas('Wyscigi','Wyniki');
  22. $joinHelper->setHas('Wyscigi','Tory');
  23. $joinHelper->setHas('Wyniki','KIerowcy');
  24.  
  25. return $joinHelper->doSelect($c);
  26. }
  27. ?>

no i sprawa jest najstepujaca jak jest ta linijka $criterion ->addOr(WynikiPeer::ID,Criteria::ISNULL) to na stronie nie mam nic zupelnie nic jak tylko wywale to linijke to wszystko wraca do normy. Nie mam pojecia co sie dzieje wtedy poniewaz nie mam ani w tym momencie debugera sf ani w logach sie nic nie zpaisuje ostatnia rzeza jaka w logach sie pojawia jest executeTerminarz();

Ktos potrafi to wytlumaczyc bede bardzo wdzieczny sad.gif


--------------------
Odpowiedziałem? Pewnie streamuję http://livecoding.tv/galileoprime.

Chcesz abym odpowiedział właśnie na Twoje pytanie? Napisz do mnie wiadomość prywatną, prócz odpowiedzi możesz zobaczyć jak rozwiązuję Twój problem.
Go to the top of the page
+Quote Post
tomeksobczak
post 7.10.2007, 11:22:25
Post #7





Grupa: Zarejestrowani
Postów: 139
Pomógł: 10
Dołączył: 6.07.2007
Skąd: opole

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


  1. <?php
  2. $criterion -> addOr(WynikiPeer::ID,Criteria::ISNULL);
  3. ?>

zamien na

  1. <?php
  2. $criterion->addOr(WynikiPeer::ID,'',Criteria::ISNULL);
  3. ?>

no i usun spacje obok ->
;]


--------------------
Go to the top of the page
+Quote Post
galileox86
post 7.10.2007, 11:48:48
Post #8





Grupa: Zarejestrowani
Postów: 59
Pomógł: 9
Dołączył: 16.06.2007
Skąd: Bytom

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


No niestety dalej nic najbardziej irytujacy jest fakt ze sie debuger nie wlancza, Kurcze az mi juz glupio ;/ ale serio nie wiem co w tym moze byc zle
chcialby uzyskac dokladnie takie zapytanie

  1. SELECT *
  2. FROM sezony LEFT OUTER JOIN wyscigi ON ( sezony.ID = wyscigi.SEZON_ID )
  3. JOIN tory ON ( tory.id = wyscigi.tor_id )
  4. LEFT OUTER JOIN wyniki ON ( wyscigi.id = wyniki.wyscig_id )
  5. LEFT OUTER JOIN kierowcy ON ( kierowcy.id = wyniki.kierowca_id )
  6. WHERE Sezony.`id` =4 AND (
  7. wyniki.wyscig_pozycja =1 OR wyniki.id IS NULL
  8. )


Hmm teraz widze ze najwidoczeniej mam jakis probel wogole z getNewCriterion poniewaz to tez nie dziala mi zachowuje sie tak samo jak poprzedni przyklad czyli zadnego errory zadnego exception a tamplate tez sie nie uruchamia, jakis pomysl questionmark.gif

  1. <?php
  2. $c = new Criteria();
  3. $c1 = $c->getNewCriterion(SezonyPeer::ID,1);
  4. $c1->addOr(SezonyPeer::ID,2);
  5. $c->add($c1);
  6. return SezonyPeer::doSelect($c);
  7. ?>


Ten post edytował galileox86 7.10.2007, 11:53:55


--------------------
Odpowiedziałem? Pewnie streamuję http://livecoding.tv/galileoprime.

Chcesz abym odpowiedział właśnie na Twoje pytanie? Napisz do mnie wiadomość prywatną, prócz odpowiedzi możesz zobaczyć jak rozwiązuję Twój problem.
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: 21.05.2024 - 14:17