Zend_Db_Select Descripció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 adaptador select(); ]]> 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 Select Construyendo consultas Select Cuando 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áusulas select(); // 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 correlacionado select() ->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 esquema select() ->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 columnas select() ->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 expresiones select() ->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ón select() ->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étodo<code>columns()</code> 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 columna select() ->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() method select() ->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 datos select() ->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 Select select() ->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() Constante Valor del String Zend_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(); ]]>