2010-09-09 9 views
7

Il mio script è come questo:Perché l'alias di colonna non funziona in doctrine?

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

E l'SQL generato è:

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

Così si ottiene un errore quando eseguire l'SQL.

Ho due domande:

  1. perché è l'alias della tabella 'i' invece di 'p'?

  2. perché la clausola 'num_a' nella clausola non è stata sostituita con 'i__0', come risolverlo?

Grazie per il suggerimento ...

risposta

7

1: perché è l'alias della tabella 'i' invece di 'p'?

2: perché il 'num_a' nell'avere clausola non sostituita con 'i__0', come risolto?

Entrambe le domande hanno semplicemente una risposta: Doctrine usa i propri alias per la query. Non è necessario conoscere questi alias in quanto essi non influiranno su di te, né dovrai lavorarci sopra.

Anche se Doctrine nomina l'alias i__0, è possibile accedere all'attributo con il proprio alias personalizzato, ad es. $yourObject->num_a avrà il valore corretto, ovvero il risultato di count(p.product_id).

Per vedere l'output della query è una funzionalità di debug utile, ma fare affidamento su all'interno dell'applicazione è privo di senso poiché questi valori vengono utilizzati solo per i meccanismi interni di Doctrine.

+0

Grazie per la vostra risposta. Sono completamente d'accordo con te sul fatto che non è necessario conoscere l'alias generato. Quello che mi lascia perplesso è che poiché l'alias per count (p.product_id) è i__0, i__0 dovrebbe essere usato per avere clausola invece di "num_a". – user443281

+1

Riconosco che si trattava di un vecchio post, ma oggi mi sono imbattuto in esso e volevo sottolineare che ci sono casi in cui questa mappatura alias della tabella interna si intromette - se si utilizza una funzione SQL come Within(), si può ' t usare alias di Doctrine all'interno dei parametri della funzione. –

6

Ho anche riscontrato un problema con l'impostazione dell'alias. Ho dovuto impostare l'alias e quindi utilizzare "ORDER BY" con quell'alias. seguente soluzione ha funzionato per me:

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

Nella query risultato sembrava" ...() AS p_0 ... ORDER BY p_0" . Spero che possa aiutare qualcuno.

1

Questo non sarebbe valido SQL.

SQL standard state che SELECT verrà eseguito logicamente dopohaving. Quindi è necessario ripetere il codice alias in having.

Buon consiglio. Finché lavorerai con SQL che consuma i DB, rimani il più vicino possibile a SQL.