2010-09-09 16 views
7

Mi guión es así:¿Por qué el alias de columna no funciona en doctrina?

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

Y el SQL generado es:

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

Por lo tanto me da un error al ejecutar el SQL.

Tengo dos preguntas:

  1. por qué es el alias de la tabla en lugar de 'i''p'?

  2. ¿por qué la cláusula 'num_a' no tiene una cláusula reemplazada por 'i__0', cómo solucionarla?

Gracias por su sugerencia ...

Respuesta

7

1: ¿por qué es el alias de la tabla 'i' en lugar de 'p'?

2: ¿por qué la 'num_a' en tener cláusula no reemplazada por 'i__0', cómo solucionarlo?

Ambas preguntas son simplemente respondidas: Doctrine utiliza sus propios alias para la consulta. No necesita saber estos alias ya que no lo afectarán ni necesitará trabajar con él.

Aunque Doctrine nombra el alias i__0, puede acceder al atributo con su alias personalizado, p. $yourObject->num_a tendrá el valor adecuado, es decir, el resultado de count(p.product_id).

Ver el resultado de su consulta es una función de depuración útil, pero no es razonable confiar en su aplicación porque estos valores solo se usan para los mecanismos internos de Doctrine.

+0

Gracias por su respuesta. Estoy completamente de acuerdo contigo en que no es necesario saber el alias generado. Lo que me desconcierta es que dado que el alias para count (p.product_id) es i__0, i__0 debe usarse para tener una cláusula en lugar de "num_a". – user443281

+1

Reconozco que esta era una publicación anterior, pero hoy me encontré con ella y quería señalar que hay casos en los que este mapeo interno de alias de tablas se interpone en el camino: si alguna vez usa una función SQL como Within(), puede ' t utilizar alias de Doctrine dentro de los parámetros de la función. –

6

También tuve un problema con la configuración de alias. Tuve que establecer un alias y luego usar "ORDER BY" con ese alias. Siguiendo solución funcionó para mí:

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

En la consulta resultado parecía" ...() como p_0 ... ORDER BY p_0" . Espero que ayude a alguien.

1

Esto no sería SQL válido.

Estado estándar SQL que SELECCIONAR se ejecutará lógicamente después dehaving. Por lo tanto, debe repetir el código con alias en having.

Buen consejo. Siempre que trabaje con DB que consumen SQL, cumpla lo más posible con SQL.

Cuestiones relacionadas