Método QU_Table::sqlSelect de QuartupERP
El Método QU_Table::sqlSelect sirve para obtener una lista de registros de una tabla, y es uno de los métodos más usados dentro de la aplicación.
Llamadas con objeto y llamadas estáticas
Tenemos dos maneras de usar este método, la llamada con objeto y la llamada estática a través de la clase QU_TablePool:
- Llamada con objeto:
- primero creamos/obtenemos el objeto:
$oExampletable = QU_TablePool::getOTable('exampletable');- después llamamos al método a través del objeto:
$aaExampletable = $oExampletable->sqlSelect($aInit, $aSelect, $action, $key, $numRows);
- Llamada estática:
$aaExampletable = QU_TablePool::sqlSelect('exampletable', $aInit, $aSelect, $action, $key, $numRows);
Los parámetros del método son los siguientes:
$aInitnos permite enviar los filtros de campos que afectan al WHERE de la lectura$aSelect(default=null) nos permite controlar los campos de retorno, las joins, los añadidos de WHERE/HAVING manuales, los GROUP-BY manuales, y otros controles especiales$action(default==) nos indica si los filtros se ejecutan por igualdad=, por mayor/menor/mayor-o-igual/menor-o-igual>,<,>=,<=$key(default=0) indicador del ORDER-BY, puede ser un número (usará los índices de la tabla) o puede ser una expresión de ORDER-BY manual$numRows(default=0) número de registros a retornar (0-todos), puede ser un número solo, o una expresión coma-separada del LIMIT sql
En los ejemplos que vienen a continuación usaremos las llamadas con objeto. Lo habitual es usar la llamada estática cuando solo queremos hacer lecturas de una tabla, y usaremos el objeto cuando necesitemos hacer operaciones complejas con la tabla.
Ejemplos simples
-
Ejemplo simple de lectura de todos los registros que tienen ciertos campos con valores concretos
$aInit = array('id_exampletable'=>1, 'campo2'=>7);$aaExampletable = $oExampletable->sqlSelect($aInit);
-
Mismo ejemplo que antes per indicando la ordenación y el número de registros
$aInit = array('id_exampletable'=>1, 'campo2'=>7);$orderby = 0;$numRows = 0;$aaExampletable = $oExampletable->sqlSelect($aInit, null, '=', $orderby, $numRows);
-
Si la ordenación es numérica, se usará el número de índice definido en la tabla
$orderby = 2;$aaExampletable = $oExampletable->sqlSelect($aInit, null, '=', $orderby, $numRows);
-
Si la ordenación es mayor de 100, se usará el número de índice $orderby-100 per de forma descendente
$orderby = 102;// índice 2 de forma descendente$aaExampletable = $oExampletable->sqlSelect($aInit, null, '=', $orderby, $numRows);
-
Si la ordenación es -1, se ejecuta sin orderby
$orderby = -1;// sin ordenación- $aaExampletable = $oExampletable->sqlSelect($aInit, null, '=', $orderby, $numRows);
-
Si la ordenación es string, se ejecuta el orderby tal cual viene
$orderby = 'nombre DESC';$aaExampletable = $oExampletable->sqlSelect($aInit, null, '=', $orderby, $numRows);
-
El numRows puede ser una string en el formato típico sql "offset,lenght"
$numRows = '10,5';$aaExampletable = $oExampletable->sqlSelect($aInit, null, '=', $orderby, $numRows);
Ejemplos de $aInit complejos
- Ejemplo con id_exampletable de valor fijo y campo2 de filtro complejo
(el prefijo FILTER indica que se usa una expresión de filtro de estilo Quartup)
$aInit = array('id_exampletable'=>1, 'FILTERcampo2'=>'7..9', 'FILTERfecha_d'=>'15/8/2019..');$aaExampletable = $oExampletable->sqlSelect($aInit);
Ejemplos de $aSelect complejos
-
ejemplo con $aSelect "transparente" (es lo mismo que enviarlo a "null") el valor ALLPHY indica que se retornen todos los campos "físicos" de la tabla (los campos físicos indican los que NO son sql NI links)
$aInit = array('id_exampletable'=>1);$aSelect = array('COLS'=>array('ALLPHY'));// valor al que equivale el 'null'$aaExampletable = $oExampletable->sqlSelect($aInit, $aSelect);
-
ejemplo con obtención de solo ciertos campos
$aInit = array('id_exampletable'=>1);$aSelect = array('COLS'=>array('id_exampletable','nombre'));$aaExampletable = $oExampletable->sqlSelect($aInit, $aSelect);
-
ejemplo con obtención de ciertos campos, y uno de ellos forzando activar una JOIN
$aInit = array('id_exampletable'=>1);$aSelect = array('COLS'=>array('id_exampletable','nombre','id_cialinmogru','Rid_cialinmogru.nombre'));$aaExampletable = $oExampletable->sqlSelect($aInit, $aSelect);
-
ejemplo con obtención de ciertos campos, y uno de ellos forzando activar una JOIN con todos los campos físicos de la tabla de la JOIN
$aInit = array('id_exampletable'=>1);$aSelect = array('COLS'=>array('id_exampletable','nombre','id_cialinmogru','Rid_cialinmogru.ALL'));$aaExampletable = $oExampletable->sqlSelect($aInit, $aSelect);
Ejemplos creando JOINs on-the-fly
En estos ejemplos no podemos usar la llamada estática, porque hemos de usar métodos del objeto que no están accesibles de forma estática
- ejemplo creando una JOIN on-the-fly
$oExampletable->addJoin('EXAMPLENEXT', 'examplejoin(id_examplejoin:$id_exampletable+1)');$aInit = array('id_exampletable'=>1);$aSelect = array('COLS'=>array('id_exampletable','nombre','id_cialinmogru','Rid_cialinmogru.ALL','REXAMPLENEXT.ALL'));$aaExampletable = $oExampletable->sqlSelect($aInit, $aSelect);
Ejemplos creando campos SQL on-the-fly
Igual que en el bloque anterior, en estos ejemplos no podemos usar la llamada estática, porque hemos de usar métodos del objeto que no están accesibles de forma estática
- añadimos el campo 'sql' del consumo
$sqlArt = "SELECT SUM(h.cantidad) FROM QU_EMPR.almamovilin AS h WHERE h.cod_articulo=exampletable.cod_articulo AND exampletable.nivel=1".QU_Sql::getMTJoin('h',exampletable');$oExampletable->setFieldExecSelect('consumo_almamovilin', $sqlArt, 'N');// el tercer parámetro indica: 'A'->alfa, 'N'->nº, 'F'->fecha, 'H'->hh:mm:ss, 'h'->hh:mm$aaExampletable = $oExampletable->sqlSelect($aInit, $aSelect);
Ejemplos especiales
- ejemplo para saber el nº de registros de la tabla o de cierta condición
$aInit = [];$oExampletable->setSwFoundRowsExecSelect(true);$aaExampletable = $oExampletable->sqlSelect($aInit, null, 1);$count = $oExampletable->getFoundRowsExecSelect();
Ejemplos para leer registros de JOINs relacionadas (de 1 a muchos) (NO USAR, DEPRECATED)
- primero obtenemos el objeto de la JOIN
$oJoin = $oExampletable->getOJoin('join_ejemplo');// el ID de la Join es el nombre del campo 'link'if (! $oJoin) { return "Join no encontrada"; }
- ejecutamos la 'select' sobre la tabla join, pasando el registro de la tabla 'exampletable' desde el cual queremos leer las relaciones
$aSqlCol = ['campo1', 'campo2'];// array de campos a devolver, a añadir a los campos físicos (que siempre se devuelven)$key = null;// índice de lectura (formato sqlSelect que admite strings sql)$numRows = 0;// nº de registros a leer (formato sqlSelect que admite strings sql)list($aaJoinReg, $numRowsSelect) = $oJoin->sqlJoinSelect($aExampletable, $aSqlCol, $key=null, $numRows=0);
- retorna array doble de registros leídos (si hay error sql, será un string con el mensaje de error), y el nº de registros total sin el LIMIT
if (is_string($aaJoinReg)) { return "Error sql ".$aaJoinReg; }