2010-09-09 11 views
7

Mój skrypt jest tak:Dlaczego alias kolumny nie działa w doktrynie?

$query = Doctrine_Query::create() 
    ->select('count(p.product_id) as num_a')    
    ->from ('ProductComments p') 
    ->groupBy('p.product_id') 
    ->having('num_a =2 '); 

a wygenerowany sql jest:

SELECT COUNT(i.product_id) AS i__0 FROM productcomments i GROUP BY i.product_id HAVING num_a=2 

Zatem pojawia się błąd podczas wykonywania sql.

Mam dwa pytania:

  1. dlaczego jest alias tabeli 'i' zamiast 'p'?

  2. dlaczego jest 'num_a' w posiadaniu klauzuli nie zastąpionej przez 'i__0', jak to naprawić?

Dzięki za sugestię ...

Odpowiedz

7

1: dlaczego jest alias tabeli 'i' zamiast 'p'?

2: dlaczego "num_a" ma klauzulę, która nie została zastąpiona przez "i__0", jak to naprawić?

Odpowiedzi na oba pytania są proste: Doctrine używa własnych aliasów do zapytania. Nie musisz znać tych aliasów, ponieważ nie będą one miały na ciebie wpływu i nie będziesz musiał z nimi pracować.

Mimo że Doctrine nazywa alias i__0, możesz uzyskać dostęp do atrybutu niestandardowym aliasem, np. $yourObject->num_a będzie mieć prawidłową wartość, a mianowicie wynik count(p.product_id).

Aby zobaczyć dane wyjściowe twojego zapytania jest przydatna funkcja debugowania, ale poleganie na wewnątrz twojej aplikacji jest pozbawione sensu, ponieważ te wartości są używane tylko dla wewnętrznych mechanizmów Doctrine.

+0

Dzięki za odpowiedź. Całkowicie się z Tobą zgadzam, że nie trzeba znać wygenerowanego aliasu. Zaskakuje mnie to, że ponieważ alias dla count (p.product_id) to i__0, to i__0 powinno być użyte w klauzuli posiadającej zamiast "num_a". – user443281

+1

Rozumiem, że był to stary post, ale natknąłem się na niego dzisiaj i chciałem wskazać, że są przypadki, w których wewnętrzne mapowanie aliasów tabeli przeszkadza - jeśli kiedykolwiek użyjesz funkcji SQL, takiej jak Within(), możesz ". • używać aliasów Doktryny wewnątrz paramustów funkcji. –

6

Wystąpił również problem z ustawianiem aliasu. Musiałem ustawić alias, a następnie użyć "ORDER BY" z tym pseudonimem. następujące rozwiązanie pracował dla mnie:

$myQuery->addSelect('(<my select>) AS my_alias'); 
$myQuery->orderBy('my_alias'); 

W kwerendzie wynikowej wyglądało”...() AS p_0 ... ORDER BY p_0" . Mam nadzieję, że to komuś pomoże.

1

To nie byłby prawidłowy SQL.

Standardowy stan SQL, w którym SELECT zostanie logicznie wykonany pohaving. Więc musisz powtórzyć kod wygaszany w having.

Dobra rada. Tak długo jak pracujesz z SQL pobierającymi DB, trzymaj się tak blisko jak to możliwe SQL.