2012-08-08 11 views
7

en primer lugar, eso es lo que estoy tratando de hacer:Zend: Seleccionar objeto: ¿Cómo reemplazo las columnas seleccionadas por from()?

En una de mis clases en la biblioteca quiero contar la cantidad total de filas de un resultado de búsqueda. La clase usa un objeto seleccionado establecido por el modelo adjunto del resultado de la búsqueda. Mi problema ahora es que este select() ya ha configurado las columnas solicitadas por from(), pero para simplemente contar las filas solo quiero seleccionar el id, porque el sitio web tiene que ser de rendimiento. No puedo simplemente cambiar los valores del objeto, porque lo estoy usando en la biblioteca y las variables están protegidas. Desafortunadamente, Zend no tiene ninguna función para el comando mySql count y no quiero usar el código mySql estático, porque podría ser que cambiemos nuestro sistema de base de datos en el futuro.

Ahora aquí es mi pregunta:

¿Hay alguna posibilidad de Zend_Select cómo podría cambiar las columnas seleccionadas?

Respuesta

15

Prueba esto:

$select->reset(Zend_Db_Select::COLUMNS) 
     ->from('thetable', 'COUNT(*)'); 

reemplazando el 'thetable' con el nombre de la tabla correcta.

+0

Tuve que eliminar la constante FROM, también, pero esto es exactamente lo que estaba buscando, ¡muchas gracias! – StoryTeller

+0

Tengo algunas "combinaciones internas" en mi consulta y después de restablecer las COLUMNAS , agrega automáticamente una "unión interna" con la tabla FROM. ¿Qué estoy haciendo mal? –

1

Esto es de un proyecto y no está probado, pero uno de estos debería funcionar.

$select->from(array("table_name" => "table_name"), array("my_col" => "COUNT(id)")); 

O

$select->from(array("table_name"), array("my_col" => "COUNT(id)")); 

Esto es lo mismo que

SELECT COUNT(id) as my_col FROM table_name 

Espero que ayude

Jake

+0

Desafortunadamente no, me sale una excepción: No se puede definir una nombre de correlación 'bd_users' más de una vez – StoryTeller

+0

Puede pasar una matriz vacía como primer parámetro, ya que no necesita volver a agregar la tabla. De esta forma, no intentará volver a declarar la correlación. – Eric

-1

Para utilizar una comando de MySQL en una selección, es necesario utilizar Zend_Db_Expr:

$select = $this->select() 
      ->from('myTable', new Zend_Db_Expr('COUNT(id) as count')); 
echo $select; //SELECT COUNT(id) as count FROM myTable; 
+0

No estoy en un modelo y no puedo escribir este código dentro de un modelo. Por favor lea la pregunta. – StoryTeller

+1

Si desea utilizar recuento, la forma correcta debería ser 'from ('myTable', array ('count' => new Zend_Db_Expr ('count (*)'))' (o ID en lugar de * si lo necesita). pero nunca deberías alias nada tú mismo. – Seti

1

Ésta no funcionó para mí (que sea necesario para seleccionar sólo de una tabla combinada):

$select->reset(Zend_Db_Select::COLUMNS) 
    ->from('thetable', 'COUNT(*)'); 

Tal vez porque tenía algunas combinaciones. Pero, sin embargo, aquí está la solución: utilizar reset() y luego columnas():

$select->setIntegrityCheck(false) 
     ->from(['t1' => 'table1']) 
     ->join(['t2' => 't2'], 't1.id = t2.t1_id') 
     ->reset(Zend_Db_Select::COLUMNS) 
     ->columns('t1.*'); 

Para su información, la versión de Zend Framework es 1,12

Cuestiones relacionadas