Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony] DOCTRINE, PROSZĘ O POMOC
blackroger
post 18.02.2011, 21:03:00
Post #1





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 8.11.2008

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


takie zapytanie
:

  1. $recordsObjs = Doctrine_Query::create()
  2. ->select('mrg.id as id, mrg.name as name')
  3. ->addSelect('(select count(*) from mailing_email where mailing_recipent_group = id and deleted <> 1) as count_emails')
  4. ->addSelect('(select count(*) from inter_mailing_group where mailing_recipent_group = id) as count_shipping')
  5. ->from('MailingRecipentGroup mrg')
  6. ->where('mrg.tomcrm_client = ?', $tomCRMClientId)
  7. ->addWhere('mrg.deleted <> ?', 1);
  8.  


JAK SIĘ PORUSZAĆ po podzapytaniach?questionmark.gif?

dokładnie tu:

  1. ->addSelect('(select count(*) from mailing_email where mailing_recipent_group = id and deleted <> 1) as count_emails')
  2.  


chodzi o ten człon "and deleted <> 1". Chcę się odnosić do mailing_email.deleted samego podzapytania(chce traktować to jako wewnetrzne osobne podzapytania), ale niestety DOCTRINE bierze sobie samo zadeklarowany Model i traktuje to jako MailingRecipentGroup.deleted (bo też posiada takie pole...). Jak to ominąć?

Proszę aby ktoś raz na zawsze mi objaśnił jak poruszac się w podzapytaniach w Doctrine, bo ostatnimi czasy przy bardziej zaawansowanych zapytaniach psychicznie nie wyrabiam smile.gif Szukałem w dokumentacji ale niestety żaden zastosowany tam przykład nie pomaga...


Wracając do pytania z innej strony....już kiedyś raz zadawałem to pytanie ale nikt nie udzielił odpowiedzi....
Na stronie Doctrine jest taki przykład....

  1. $q = Doctrine_Query::create()
  2. ->select('u.id')
  3. ->addSelect('(SELECT p.phonenumber FROM Phonenumber p WHERE p.user_id = u.id LIMIT 1) as phonenumber')
  4. ->from('User u');


poprzez analogię próbuje:

  1.  
  2. $recordsObjs = Doctrine_Query::create()
  3. ->select('mrg.id as id, mrg.name as name')
  4. ->addSelect('(select count(*) from MailingEmail me where me.mailing_recipent_group = mrg.id and me.deleted <> 1 limit 1) as count_emails')
  5. ->from('MailingRecipentGroup mrg')
  6. ->addWhere('mrg.deleted <> ?', 1);


i ciągle błąd....o co chodzi...wtf?

Ten post edytował blackroger 19.02.2011, 00:30:19
Go to the top of the page
+Quote Post
Daiquiri
post 20.02.2011, 00:31:37
Post #2





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




Proszę poprawić temat, na taki który lepiej odda charakter problemu.
Go to the top of the page
+Quote Post
Zyx
post 20.02.2011, 09:10:47
Post #3





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

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


Doctrine trochę średnio sobie radzi z obsługą podzapytań, niemniej u Ciebie pojawia się problem tego typu, że masz podzapytanie, a nigdzie go nie wykorzystujesz. Fajnie byłoby też, gdybyś np. podał jakieś informacje, CO to za błąd Ci się wyświetla...


--------------------
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
blackroger
post 22.02.2011, 13:20:51
Post #4





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 8.11.2008

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


Udało się... napisze to, jak ja to zrobiłem. Jakby ktoś miał inny sposób to proszę aby się podzielił...

Przekształciłem powyższą logikę zapytania w następujący sposób:

  1.  
  2. $recordsObjs = Doctrine_Query::create()
  3. ->select('mrg.id as id, mrg.name as name');
  4.  
  5. $recordsObjs2 = $recordsObjs->createSubquery()
  6. ->select('count(me.id)')
  7. ->from('MailingEmail me')
  8. ->where('me.mailing_recipent_group = mrg.id')
  9. ->addWhere('me.deleted <> 1')
  10. ->limit(1);
  11.  
  12. $recordsObjs3 = $recordsObjs->createSubquery()
  13. ->select('count(img.id)')
  14. ->from('InterMailingGroup img')
  15. ->innerJoin('img.Mailing m')
  16. ->where('img.mailing_recipent_group = mrg.id')
  17. ->addWhere('m.deleted <> 1')
  18. ->limit(1);
  19.  
  20. $recordsObjs->from('MailingRecipentGroup mrg')
  21. ->addSelect('('.$recordsObjs2->getDql().') as count_emails')
  22. ->addSelect('('.$recordsObjs3->getDql().') as count_shipping')
  23. ->where('mrg.deleted <> ?', 1);
  24.  


jak widać istnieje taka funkcja jak createSubquery(). Pozwala ona utworzyć "osobne zapytania" które nie są identyfikowane jednoznacznie przez główny model "from". Co najlepsze istnieje możliwość połączenia tych podzapytań z poszczególnymi wierszami zapytania głównego

  1. ->where('img.mailing_recipent_group = mrg.id')


W ten sposób otrzymujemy nie kłócące się ze sobą obiekty modelu.
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: 23.06.2025 - 11:48