Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony][Propel] Wyrażenie ... WHERE ... IN (SELECT ...), jak skonstruować takie wyrażnie?
Thomashek
post 21.08.2008, 13:08:15
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 14.12.2007

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


Mam problem z rozkazaniem klasie, aby pokazała tylko takie obiekty, których wartość ID nie występuje w kolumnie wartości ID2 innej tabeli, czyli chcę tak rozkazać klasie wygenerowanej przez Propela, aby przetłumaczyła to na taki SQL:
  1. SELECT tabela1.ID FROM tabela1 WHERE tabela1.ID NOT IN (SELECT tabela2.ID2 FROM tabela2)


W jaki sposób tego dokonać?

Z góry dziękuję za odpowiedzi
Go to the top of the page
+Quote Post
LBO
post 21.08.2008, 13:18:34
Post #2





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


Obiło mi się o uszy, że Propel nie obsługuje zagnieżdżonych zapytań.

edit:

Żeby nie było - jestem tego pewien.

Wyciągnij PDO i użyj własnego zapytania.
Go to the top of the page
+Quote Post
Thomashek
post 21.08.2008, 13:45:02
Post #3





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 14.12.2007

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


Hm, chciałem zrobić coś w rodzaju:
  1. <?php
  2. $c = new Criteria();
  3. $c->add('tabela1.ID NOT IN (SELECT tabela2.ID2 FROM tabela2)');
  4. return Tabela1Peer:doSelect($c);
  5. ?>


Jednak to zapytanie wewnątrz add() jest konwertowane na niepoprawne :/ Można w jakiś prosty sposób dodać warunek w postaci zwykłego SQLa do zapytania?

//dodano:
Powyższy sposób działa, jeśli zamiast tamtego add-a zrobi się taki:
  1. <?php
  2. $c->add('tabela1.ID NOT IN (SELECT ID2 FROM tabela2)');
  3. ?>

Czyli usunąć trzeba nazwę tabeli przed polem. Ale to i tak rozwiązanie bardzo naokoło, nie podoba mi się (choć już działa) :/

//dodano2:
Tfu, nie działa. Bo dodaje IS NULL na końcu. Potrzebuję nadal odpowiedzi na pytanie, czy można dodać warunek w postaci zwykłego SQLa do obiektu Criteria?

Ten post edytował Thomashek 21.08.2008, 13:51:09
Go to the top of the page
+Quote Post
LBO
post 21.08.2008, 13:53:59
Post #4





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


Zależy Tobie na obiektach, prawda?

Nic prostszego, możesz użyć własnego zapytania w czystym SQL jak i posiadać po tym obiekty.

Tutorial
Go to the top of the page
+Quote Post
Thomashek
post 21.08.2008, 14:02:53
Post #5





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 14.12.2007

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


Dzięki, pomogłeś.

A konkretnie to, o co mi chodziło:
  1. <?php
  2. $c->add('tabela1.ID', 'tabela1.ID NOT IN (SELECT ID2 FROM tabela2)', Criteria::CUSTOM);
  3. ?>

Dzięki temu CUSTOM nie jest w ogóle ruszany warunek w środku, nie jest nic dopisywane - czyli tak, jak chciałem. Dzięki.
Go to the top of the page
+Quote Post
LBO
post 21.08.2008, 14:04:15
Post #6





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


  1. <?php
  2. $c = new Criteria();
  3. $select = "tabela1.ID NOT IN (SELECT tabela2.ID2 FROM tabela2)";
  4. $c->add(Tabela1Peer::ID, $select, Criteria::CUSTOM);
  5. return Tabela1Peer:doSelect($c);
  6. ?>

edit:
Byłeś szybszy :]

Ten post edytował LBO 21.08.2008, 14:04:58
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.06.2025 - 05:51