Zend_Db_SelectDescripción del Objeto Select
El objeto Zend_Db_Select object representa una declaración de consulta
SELECT de SQL. La clase tiene métodos para agregar partes
individuales a la consulta. Puedes especificar algunas partes de la consulta
usando los métodos en PHP y sus estructuras de datos, y la clase forma la sintaxis
SLQ correcta. Despues de construir la consulta, puedes ejecutarla como si
se hubiera escrito como un string.
El valor entregado por Zend_Db_Select incluye:
Métodos Orientados a objetos para especificar consultas SQL
de manera pieza-a-pieza;
Abstracción de partes de las consultas SQL, independiente de la
Base de datos;
Entrecomillado automático de identificadores de metadatos en
la mayoría de los casos, soportanto identificadores que contienen palabras
reservadas de SQL y caracteres especiales;
Entrecomillado de identificadores y valores, para ayudar a reducir el
riesgo de ataque de inyección SQL.
El uso de Zend_Db_Select no es obligatorio. Para consultas SELECT muy simples,
es usualmente más simple especificar la consulta completa como un string
y ejecutarla usando un método del Adapter como query() o
fetchAll(). Usar Zend_Db_Select es util si se necesita ensamblar
una consulta SELECT proceduralmente, o basado en condiciones lógicas en
la aplicación.
Creando un Objeto Select
Puedes crear un a instancia del objeto Zend_Db_Select usando el método
select() de un objeto Zend_Db_Adapter_Abstract.
Ejemplo del método select() del adaptadorselect();
]]>
Otra manera de crear el objeto Zend_Db_Select es con su constructor,
especificando el adaptador de base de datos como un argumento.
Ejemplo de creación de un nuevo objeto SelectConstruyendo consultas SelectCuando se construye una consulta, puede agregar clausulas a esta, una por una.
Hay un método separado para agregar cada al objeto Zend_Db_Select.Ejemplo de uso de métodos que agregan cláusulasselect();
// Agregar una cláusula FROM
$select->from( ...specify table and columns... )
// Agregar una cláusula WHERE
$select->where( ...specify search criteria... )
// Agregar una cláusula ORDER BY
$select->order( ...specify sorting criteria... );
]]>
También puede utilizar la mayoría de los métodos del objeto Zend_Db_Select con una
interfaz fluida. Una interfaz fluida significa que cada método retorna una referencia
al objeto que se ha llamado, así puedes llamar inmediatamente a otro método.Ejemplo de uso de la interfaz fluida.select()
->from( ...specify table and columns... )
->where( ...specify search criteria... )
->order( ...specify sorting criteria... );
]]>
Los ejemplos en esta sección muestran el uso de la interfaz fluída, pero también
puedes usar la interfaz no-fluída en todos los casos. A menudo es necesario
utilizar la interfaz no-fluída, por ejemplo, si su aplicación necesita realizar
cierta lógica antes de añadir una cláusula a la consulta.Agregando una cláusula FROM
Especifica la tabla para esta consulta usando el método from().
Puedes especificar el nombre de la tabla como un simple string. Zend_Db_Select
aplica el identificador entrecomillando el nombre de la tabla, así puedes
usar caracteres especiales.
Ejemplo del método from()select()
->from( 'products' );
]]>
Puedes especificar un nombre correlacionado (también llamado a veces
"alias de tabla") para una tabla. En lugar de un simple string, se usa un
array asociativo que mapee el nombre de la correlación con el nombre de la tabla.
En otras cláusulas de consulta SQL, se usa esta correlación de nombre.
si su consulta se une con más de una tabla, Zend_Db_Select generatiza una
correlación unica de nombres basados en el nombre de la tabla, para una tabla
a la cual no se le espicifique un nombre correlacionado.
Ejemplo especificando una tabla con nombre correlacionadoselect()
->from( array('p' => 'products') );
]]>
Algunos RDBMS apoyan el uso de un especificador de esquema para una tabla.
Puedes especificar el nombre de la tabla como
"nombreDeEsquema.nombre DeTabla", donde Zend_Db_Select entrecomillará
cada parte individualmente, o tambien puedes especificar el nombre de esquema
por separado. Un nombre de esquema especificado en el nombre de la tabla toma
precedencia en sobre un esquema dado por separado en el caso de que ambos
sean dados.
Ejemplo especificando un nombre de esquemaselect()
->from( 'myschema.products' );
// o
$select = $db->select()
->from('products', '*', 'myschema');
]]>
Agregando Columnas
En el segundo argumento del método from(), puedes especificar
las columnas a seleccionar desde la respectiva tabla.
Si no especificas columns, por defecto será "*",
el comodín SQL para "todas las columnas".
Puedes listar las columnas en un simple array de strings, o en un
array asociativo mapeando los alias de columnas a su nombre de tabla.
Si solo se especifica una columna en la consulta y no necesitas especificar un
alias de columna, puedes listarla solo con un string plano de lugar de un array.
Si se entrega un array vacío como el argumento de las tablas, no se incluirán
columnas en el resultado. Vea un
codigo de ejemplo
bajo la sección del método join().
Puedes especificar el nombre de columna como
"nombreCorrelacionado.nombreDeColumna".
Zend_Db_Select entrecomullará cada parte individualmente. Si no especificas
un nombre correlacionado para una columna, se usará el nombre correlacionado
para la tabla nombrada en el actual método from().
Ejemplos especificando columnasselect()
->from(array('p' => 'products'),
array('product_id', 'product_name'));
// Construir la misma consulta, especificando nombres correlacionados:
// SELECT p."product_id", p."product_name"
// FROM "products" AS p
$select = $db->select()
->from(array('p' => 'products'),
array('p.product_id', 'p.product_name'));
// Construir esta consulta con una alias para una columna:
// SELECT p."product_id" AS prodno, p."product_name"
// FROM "products" AS p
$select = $db->select()
->from(array('p' => 'products'),
array('prodno' => 'product_id', 'product_name'));
]]>
Agregando una Expresión en las Columns
Las columnas en consultas SQL a veces son expresiones, no simples columnas
de una tabla. Las expresiones no deberían tener nombres correlacionados o entrecomillado aplicado.
Si sus columnas contienen parentesis, Zend_Db_Select las reconoce como una expresión.
Tambien puedes crear un objeto de tipo Zend_Db_Expr explícitamente, para prevenir
que el string sea tratado como columna. Zend_Db_Expr es una clase mínima, que contiene
un simple string. Zend_Db_Select reconoce el objeto de tipo Zend_Db_Expr y
lo convierte de vuelta en el string, pero no le aplica ninguna alteración,
tal como el entrecomillado o la correlación de nombres.
El Uso de Zend_Db_Expr para nombres de columnas no es necesario si
la expresión de la columna contiene parentesis; Zend_Db_Select reconoce
y trata el string como expresión, saltándose el entrcomillado y la
correlación de nombres.
Ejemplos especificando columnas que contienen expresionesselect()
->from(array('p' => 'products'),
array('product_id', 'LOWER(product_name)'));
// Construye esta consulta:
// SELECT p."product_id", (p.cost * 1.08) AS cost_plus_tax
// FROM "products" AS p
$select = $db->select()
->from(array('p' => 'products'),
array('product_id',
'cost_plus_tax' => '(p.cost * 1.08)')
);
// Construye esta consulta usando Zend_Db_Expr explícitamente:
// SELECT p."product_id", p.cost * 1.08 AS cost_plus_tax
// FROM "products" AS p
$select = $db->select()
->from(array('p' => 'products'),
array('product_id',
'cost_plus_tax' =>
new Zend_Db_Expr('p.cost * 1.08'))
);
]]>
En los casos anteriores, Zend_Db_Select no altera el string para aplicar
correlación de nombres o entrecomillado de identificadores. Si estos
cambios son necesarios para resolver ambigüedades, deberías realizar
cambios manualmente en el string.
Si el nombre de su columna es alguna palabra reservada de SQL o
contiene caracteres especiales, debería usar el método
quoteIdentifier() del Adapdator e interpolar el resultado en un
string. El método quoteIdentifier() usa entrecomillado SQL para
delimitar el identificador,
the identifier, dejando en claro que es un identificador de tabla o columna y no
otra parte de la sintaxis SQL.
Su código es más independiente de la base de datos si se usa el método
quoteIdentifier() en vez de las excribir literalmente las comillas
en la cadena, debido a que algunos RDBMS no usan simbolos estándar para entrecomillar
identificadores.
El método quoteIdentifier() está diseñado para usar los símbolos
apropiados para entrecomillar basado en el tipo del adaptador.
El método quoteIdentifier() también escapa
cual caracter de comilla que aparezca en el nombre del identificador mismo.
Ejemplo de entrecomillado de columnas en una expresiónselect()
->from(array('p' => 'products'),
array('origin' =>
'(p.' . $db->quoteIdentifier('from') . ' + 10)')
);
]]>
Agregar columnas a una tabla FROM o JOIN existente
Puede haber casos en los que desea agregar columnas a una tabla FROM o JOIN
después de que estos métodos han sido llamados. El método columns()
permite agregar columnas en cualquier punto antes de ejecutar la consulta.
Puedes pasar las columnas bien como un string, un Zend_Db_Expr o
un array de estos elementos. El segundo argumento para este método puede ser omitido,
implicando que las columnas serán agregadas a una tabla FROM, en otro caso
debería usarse un nombre de correlación existente.
Ejemplos agregando columnas con el métodocolumns()select()
->from(array('p' => 'products'), 'product_id')
->columns('product_name');
// Construir la misma consulta, especificando correlación de nombres:
// SELECT p."product_id", p."product_name"
// FROM "products" AS p
$select = $db->select()
->from(array('p' => 'products'), 'p.product_id')
->columns('product_name', 'p');
// Alternativamente puede usar columns('p.product_name')]]>
Agregar Otra Tabla a la Consulta Query con JOIN
Muchas consultas útiles involucran el uso de un JOIN para
combinar filas de multiples tablas. Puedes agregar tablas a una consulta Zend_Db_Select
usando el método join(). Usar este método, es similar
al método from(), excepto que puedes especificar una condición de unión
en la mayoría de los casos.
Ejemplo del método join()select()
->from(array('p' => 'products'),
array('product_id', 'product_name'))
->join(array('l' => 'line_items'),
'p.product_id = l.product_id');
]]>
El segundo argumento join() es un string que es usado como condición de unión.
Esta es una expresión que declara un criterio por el cual las filas en una tabla concuerdan con
las filas de la otra tabla. Puedes especificar correlación de nombres en esta expresión.
No se aplica entrecomillado en la expresión especificada para la condición de unión;
si tienes problemas con nombres que necesitan ser entrecomillados, deberás usar
quoteIdentifier() para formar el string de condición de unión.
El tercer argumento join() es un array de nombres de columnas, como
al usar el método from(). Este es por defecto "*", soporta
correlación de nombres, expresiones, y Zend_Db_Expr de la misma manera que el array de
nombres de columnas en el método from().
Para no seleccionar columnas de una tabla, use un array vacío para la lista de columnas.
El uso de esto trabaja con el método from() también, pero en general
deseará algunas columnas de la tabla primaria en sus consultas, a la vez que no se desean
columnas de la tabla unida.
Ejemplo especificando ninguna columnaselect()
->from(array('p' => 'products'),
array('product_id', 'product_name'))
->join(array('l' => 'line_items'),
'p.product_id = l.product_id',
array() ); // empty list of columns
]]>
Note el array vacío array() en el ejemplo anterior
en lugar de una lista de columnas de la tabla unida.
SQL tiene muchos tipos de uniones. Vea una lista a continuación para los métodos
que soportan cada tipo de unión en Zend_Db_Select.
INNER JOIN con los métodos
join(table, join, [columns]) o
joinInner(table, join, [columns]).
Esta es el tipo de unión más comun. Las filas de cada tabla son comparadas
usando la condición de unión especificada. El resultado incluye solo las filas
que satisfacen la condición. El resultado puede ser vacio si no hay filas que
satisfagan la condición.
Todos los RDBMS soportan este tipo de unión.
LEFT JOIN con el método
joinLeft(table, condition, [columns]).
Todas las filas de tabla a la izquierda del operando son incluídas,
pareando las filas de la tabla a la derecha del operando,
y las columnas de la tabla a la derecha del operando son rellenadas con
NULLs si no existen filas que calcen con la tabla a la izquierda.
Todos los RDBMS soportan este tipo de unión.
RIGHT JOIN con el método
joinRight(table, condition, [columns]).
Unión exterior por la derecha es un complemento de la unión exterior por la
izquierda. Todas las filas de la tabla a la derecha del operando son incluídos,
pareando las filas de la tabla a la izquierda del operando incluídos, y las
columnas de la tabla a la izquierda del operando son rellenadas con NULLs si
no existen filas que calcen con la tabla de la derecha.
Algunos RDBMS no soportan'este tipo de join, pero en general, cualquier unión
por la derecha puede representarse por una unión por la derecha invirtiendo
el orden de las tablas.
FULL JOIN con el método
joinFull(table, condition, [columns]).
Una unión externa total es como una combinación de una unión exterior por
la izquierda y una unión exterior por la derecha.
Todas las filas de ambas tablas son incluídas, vinculadas entre sí
en la misma fila si estos satisfacen la condición de unión, y en otro
caso se vinculan con valores nulos en lugar de columnas de la otra tabla.
Algunos RDBMS no soportan este tipo de unión.
CROSS JOIN con el método
joinCross(table, [columns]).
Una unión cruzada es un Producto Cartesiano. Cada fila en la primera tabla
es pareada con cada una en la segunda tabla.
Por lo tanto, el número de filas en el resultado es igual al producto del
número de filas en cada tabla.
Puede filtrar el conjunto de resultados con el uso de condiciones en una
cláusula WHERE; de esta forma una unión cruzada es similar a la antigua
sintaxis de unión en SQL-89.
El método joinCross() no tiene parámetros para especificar una
condición de unión. Algunos RDBMS no soportan este tipo de unión.
NATURAL JOIN con el método
joinNatural(table, [columns]).
Una unión natural compara cualquier columa(s) que aparezca con el nombre
en ambas tablas. La comparación es el equivalente de todas las columna(s);
comparando las columnas usando desigualdad no es una unión natural.
Solo la unión interna natural es soportada por este API, aun cuando SQL
permita una unión externa natural.
El método joinNatural() no tiene parámetros para especificar una condición.
Además de los métodos de unión, puedes simplificar las consultas
usando métodos JoinUsing. En vez de proveer una condición completa a la unión,
simplemente pasas el nombre de columna en la que se hará la uninón y
el objeto Zend_Db_Select completa la condición por ti.
Ejemplo de método joinUsing()select()
->from('table1')
->joinUsing('table2', 'column1')
->where('column2 = ?', 'foo');]]>
Cada uno de los métodos aplicables para uniones en el componente
Zend_Db_Select tiene su correspondiente método 'usando'.
joinUsing(table, join, [columns]) y
joinInnerUsing(table, join, [columns])joinLeftUsing(table, join, [columns])joinRightUsing(table, join, [columns])joinFullUsing(table, join, [columns])Agregar una cláusula WHERE
Puede especificar un criterio para restringir las filas de resultado
usando el método where(). El primer argumento de este método
es una expresión SQL, y esta expresión es usada como una expresión SQL
WHERE en la consulta.
Ejemplo del método where() 100.00
$select = $db->select()
->from('products',
array('product_id', 'product_name', 'price'))
->where('price > 100.00');]]>
No se aplica entrecomillado en una expresión dada en el método where() u
orWhere(). Si tienes nombres de columnas que necesitan ser entrecomillada,
debe usar el método quoteIdentifier() para formar el string de la condición.
El segundo argumento del método where() es opcional.
Es un valor a sustituir en la expresión. Zend_Db_Select entrecomilla el valor
y sustituye por un signo de interrogación ("?") en la expresión.
Este método acepta solo un parámetro. Si tienes una expresión
en la cual necesitas sustituir multiples variables, deberás formar
el string manualmente, interpolando variables y realizando entrecomillado
tu mismo.
Ejemplo de parámetro en el método where() 100.00)
$minimumPrice = 100;
$select = $db->select()
->from('products',
array('product_id', 'product_name', 'price'))
->where('price > ?', $minimumPrice);
]]>
Puedes invocar el método where() multiples veces en el mismo objeto
Zend_Db_Select. La consulta resultante combina los multiples terminos
juntos usando AND entre ellos.
Ejemplo de multiples métodos where() 100.00)
// AND (price < 500.00)
$minimumPrice = 100;
$maximumPrice = 500;
$select = $db->select()
->from('products',
array('product_id', 'product_name', 'price'))
->where('price > ?', $minimumPrice)
->where('price < ?', $maximumPrice);
]]>
Si necesitas combinar terminos juntos uando OR, use el método
orWhere(). Este mñetodo se usa del mismo modo que el método
where(), excepto que el termino especificado es precedido por
OR, en lugar de AND.
Ejemplo del método orWhere() 500.00)
$minimumPrice = 100;
$maximumPrice = 500;
$select = $db->select()
->from('products',
array('product_id', 'product_name', 'price'))
->where('price < ?', $minimumPrice)
->orWhere('price > ?', $maximumPrice);
]]>
Zend_Db_Select automáticamente pone paréntesis alrededor de cada expresión
que especifiques usandp el método where() u orWhere().
Esto ayuda a asegurar que la precedencia del operador Booleano no cause resultados
inesperados.
Ejemplos de Expresiones Booleanas con parentesis 500.00)
// AND (product_name = 'Apple')
$minimumPrice = 100;
$maximumPrice = 500;
$prod = 'Apple';
$select = $db->select()
->from('products',
array('product_id', 'product_name', 'price'))
->where("price < $minimumPrice OR price > $maximumPrice")
->where('product_name = ?', $prod);
]]>
En el ejemplo anterior, los resultados deberían ser diferentes sin paréntesis,
porque AND tiene alta precedencia respecto a OR.
Zend_Db_Select aplica el parentesis con un efecto tal que la expresión en sucesivas
llamadas al método where() vincule más estrechamente el AND
que combina las expresiones.
Agregando una cláusula GROUP BY
En SQL, la cláusula GROUP BY permite reducir el número
de filas del resultado de una consulta a una fila por cada valor único
encontrado en la(s) columna(s) nombrada(s) en la cláusula
GROUP BY.
En Zend_Db_Select, puedes especificar la(s) columna(s) a usar para el
cálculo de grupos de filas usando el método group().
El argumento de este método es una columna o un array de columnas
que se usarán en la cláusula GROUP BY.
Ejemplo del método groups group()select()
->from(array('p' => 'products'),
array('product_id'))
->join(array('l' => 'line_items'),
'p.product_id = l.product_id',
array('line_items_per_product' => 'COUNT(*)'))
->group('p.product_id');
]]>
Como el array de columnas del método from(), peudes usar
correlación de nombres en el string de nombre de columna, y la conlumna será
entrecomillada como un identificador, salvo que el string contenga paréntesis
o sea un objeto de tipo Zend_Db_Expr.
Agregando una cláusula HAVING
En SQL, la cláusula HAVING aplica una condición de restricción
en grupos de filas. Es similar a una cláusula WHERE
aplicando una condición de restricción a las filas. Pero las 2 cláusulas
son diferentes porque las condiciones WHERE
son aplicadas antes que definan los grupos, mientras que las condiciones
HAVING son aplicadas después que los grupos son definidos.
En Zend_Db_Select, puedes especificar condiciones para restringir
grupos usando el método having(). Su uso es similar al
del método where(). El primer agumento es un string
conteniendo una expresión SQL. El segundo argumento es un valor
que es usado para reemplazar un parámetro marcador de posición en la
expresión SQL. Las expresiones dadas en multiples invocaciones al método
having() son combinados usando el operador Booleano
AND, o el operador OR si usas el método
orHaving().
Ejemplo del método having() 10
$select = $db->select()
->from(array('p' => 'products'),
array('product_id'))
->join(array('l' => 'line_items'),
'p.product_id = l.product_id',
array('line_items_per_product' => 'COUNT(*)'))
->group('p.product_id')
->having('line_items_per_product > 10');
]]>
No se aplica entrecomillado a expresiones dadas al método having() u
orHaving(). Si tienes nombres de columnas que deban ser
entrecomillados, deberás usar quoteIdentifier() para
formar el string de la condición.
Agregar una cláusula ORDER BY
En SQL, la cláusula ORDER BY especifica una o más
columnas o expresiones por el cual el resultado de la consulta
será ordenado. Si multiples columnas son listadas, las columnas secundarias
serán usadas para resolver relaciones; el orden de clasificación es determinado
por columnas secundarias si la columna anterior contiene valores identicos.
El orden por defecto es del menor valor al mayor valor. Puedes también
ordenar de mayor a menor valor para una columna dada en la lista espeificando
la palabra clave DESC despues de la columna.
En Zend_Db_Select, puedes usar el método el método order()
para especificar una columna o un array de columnas por el cual ordenar.
Cada elemento del array es un string nombrando la columna. Opcionalmente con la
palabra reservada ASC o DESC siguiendola, deparada
por un espacio.
Como en el método from() y group(), los nombres de columnas
son entrecomillados como identificadores, a menos que contengan paréntesis
o sean un obheto de tipo Zend_Db_Expr.
Ejemplo del método order()select()
->from(array('p' => 'products'),
array('product_id'))
->join(array('l' => 'line_items'),
'p.product_id = l.product_id',
array('line_items_per_product' => 'COUNT(*)'))
->group('p.product_id')
->order(array('line_items_per_product DESC',
'product_id'));
]]>
Agregando una cláusula LIMIT
Algunos RDBMS extienden una consulta SQL con una cláusula conocida como LIMIT.
Esta cláusuala reduce el número de filas en el resultado a no más de un número
especificado. También puedes especificar saltar el número de filas antes
de empezar la salida. Esta característica hace más fácil tomar un subconjunto de
resultados, por ejemplo cuando mostramos los resultados de una consulta en
progresivas páginas de salida.
En Zend_Db_Select, puedes usar el método limit() para especificar
la cantidad de filas y el número de filas a saltar. El primer argumento es
el método es el número de filas deseado. El segundo argument es el númerp de filas a saltar.
Ejemplo del método limit()select()
->from(array('p' => 'products'),
array('product_id', 'product_name'))
->limit(10, 20);
]]>
La sintaxis de LIMIT no está soportada por todos los RDBMS brands.
Algunos RDBMS requieren diferente sintaxis para soportar una funcionalidad simialr.
Cada clase Zend_Db_Adapter_Abstract incluye un método
para producir el SQL apropiado para cada RDBMS.
Use el método limitPage() como un modo alternativa de
especificar la cantidad de filas y compensación.
Este método permite limitar el conjunto resultado a una serie de subconjuntos
de tamaño fijo de filas del total del resultado de la consulta.
En otras palabras, puedes especificar el tamaño de una "página" de resultados,
y el número ordinal de la página simple donde se espera que retorne la consulta.
El número de página es el primer argumento del método limitPage(),
y la longitud de la página es el segundo argumento.
Ambos son argumentos requeridos; no tienen valores por omisión.
Ejemplo del método limitPage()select()
->from(array('p' => 'products'),
array('product_id', 'product_name'))
->limitPage(2, 10);
]]>
Agregar el modificador DISTINCT a la consulta
El método distinct() permite agregar la palabra
clave a la consulta DISTINCT a su consulta SQL.
Ejemplo del método distinct()select()
->distinct()
->from(array('p' => 'products'), 'product_name');
]]>
Agregar el modificador FOR UPDATE
El método forUpdate() permite agregar el modificador
FOR UPDATE a su consulta SQL.
Example of forUpdate() methodselect()
->forUpdate()
->from(array('p' => 'products'));
]]>
Ejecutando consultas Select
Esta sección se describe como ejecutar una consulta representada por
un objeto Zend_Db_Select.
Ejecutando Consultas SelectExecuting desde el Adaptador de Base de Datos
Puedes ejecutar la consulta representada por el objeto Zend_Db_Select pasandolo
como primer argumento al método query() de un objeto Zend_Db_Adapter_Abstract.
Use objetos Zend_Db_Select en lugar de un string de consulta.
El método query() retorna un objeto de tipo
Zend_Db_Statement o PDOStatement, dependiendo del tipo de adaptador.
Ejemplo usando el método adaptador query() del Adaptador de Base de datosselect()
->from('products');
$stmt = $db->query($select);
$result = $stmt->fetchAll();
]]>
Ejecutando Consultas Select desde el Objeto
Como alternativa al uso del método query() del objeto adaptador,
puedes usar el método query() del objeto Zend_Db_Select. Ambos
métodos retornan un objeto de tipo Zend_Db_Statement o PDOStatement, dependiendo
del tipo de adaptador.
Ejempo usando el método query() del objeto Selectselect()
->from('products');
$stmt = $select->query();
$result = $stmt->fetchAll();
]]>
Convertiendo un Objeto Select a un String SQL
Si necesitas acceder a una represantación en un string de la
consulta SQL correspondiente al objeto Zend_Db_Select,
use el método __toString().
Ejemplo del método __toString()select()
->from('products');
$sql = $select->__toString();
echo "$sql\n";
// The output is the string:
// SELECT * FROM "products"
]]>
Otros Métodos
Esta sección describe otros métodos de Zend_Db_Select que no han
sido cubiertos antes: getPart() y reset().
Obtener Partes de un Objeto Select
El método getPart() retorna una representación de
una parte de su consulta SQL. Por ejemplo, puedes usar este
método para retornar un array de expresiones para la cláusula
WHERE, o el array de columnas (o expresiones de
columnas) que estan en la lista del SELECT, o los
valores de la cantidad y comienzo para la cláusula
LIMIT.
El valor de retorno no es un string conteniendo un fragmento
de la sintaxis SQL. El valor de retorno es una representación,
típicamente un array con una estructura que contiene valores y
expresiones. Cada parte de la consulta tiene una estructura
diferente.
El único argumento del método getPart() es un
string que identifica que parte del la consulta Select va a
retornar. Por ejemplo, el string 'from' identifica
la parte del objeto Select que almacena la información de las
tablas de la cláusula FROM, incluyendo uniones de
tablas.
La clase Zend_Db_Select define constantes que puedes usar para
las partes de la consulta SQL.
Puedes usar estas definiciones de constantes, o los strings
literales.
Constantes usedas por getPart() y reset()ConstanteValor del StringZend_Db_Select::DISTINCT'distinct'Zend_Db_Select::FOR_UPDATE'forupdate'Zend_Db_Select::COLUMNS'columns'Zend_Db_Select::FROM'from'Zend_Db_Select::WHERE'where'Zend_Db_Select::GROUP'group'Zend_Db_Select::HAVING'having'Zend_Db_Select::ORDER'order'Zend_Db_Select::LIMIT_COUNT'limitcount'Zend_Db_Select::LIMIT_OFFSET'limitoffset'
Ejemplo del método getPart()select()
->from('products')
->order('product_id');
// Puedes especificar un string string literal para especificar la parte
$orderData = $select->getPart( 'order' );
// Puedes usar una constante para especificar la misma parte
$orderData = $select->getPart( Zend_Db_Select::ORDER );
// El valor de retorno puede ser una estructura en un array, no un string.
// Cada parte tiene distinta estructura.
print_r( $orderData );
]]>
Restableciendo Partes de un Objeto
El método reset() permite limpiar una parte
específica de la consulta SQL, o limpia todas las partes de la
consulta SQL si omites el argumento.
El argumento es opcional. Puedes especificar la parte de la
consulta que será limpiada, usando los mismos strings que usa el
argumento del método getPart(). La parte de la
consulta que especifiques se reestablecerá a su estado por
omisión.
Si omites el parámetro, reset() cambia todas las
partes de la consulta a su estado por omisión. Esto hace que
el objeto Zend_Db_Select sea equivalente a crear un nuevo
objeto, como si acabases de instanciarlo.
Ejemplo del método reset()select()
->from(array('p' => 'products')
->order('product_name');
// Requisito cambiado, en su lugar un orden diferente de columnas:
// SELECT p.*
// FROM "products" AS p
// ORDER BY "product_id"
// Limpia una parte para poder redefinirla
$select->reset( Zend_Db_Select::ORDER );
// Y especificar una columna diferente
$select->order('product_id');
// Limpia todas las partes de la consulta
$select->reset();
]]>