administrador.base.orm.filtros.sql - gamboamartin/administrador GitHub Wiki
sql
La función sql
construye una consulta SQL a partir de un objeto stdClass
llamado $complemento
, que contiene diferentes partes de una consulta, tales como filtros, cláusulas WHERE
, GROUP BY
, LIMIT
, y ORDER BY
. La función también inicializa cualquier clave faltante en el objeto complemento
y ajusta la consulta resultante para eliminar espacios innecesarios. Finalmente, devuelve la consulta SQL completa.
Signatura
private function sql(stdClass $complemento, string $consulta_previa): string
Parámetros
stdClass $complemento
- Tipo:
stdClass
- Descripción: Un objeto que contiene los diferentes componentes de una consulta SQL, como filtros, sentencias, cláusulas
WHERE
,LIMIT
, etc. Si algunas claves no están definidas, serán inicializadas como cadenas vacías.
string $consulta_previa
- Tipo:
string
- Descripción: La consulta SQL previa a la cual se agregarán las cláusulas y filtros proporcionados por el objeto
$complemento
.
Retorno
string
- Tipo:
string
- Descripción: Devuelve la consulta SQL completa, con los filtros, sentencias y demás cláusulas ajustadas y concatenadas.
Explicación Detallada
-
Inicialización de claves en
$complemento
:- La función comienza verificando que las claves esperadas dentro de
$complemento
estén definidas. Si alguna clave no está presente, se inicializa como una cadena vacía.
$keys = array('filtro_especial', 'filtro_extra', 'filtro_fecha', 'filtro_rango', 'in', 'not_in', 'diferente_de', 'sentencia', 'sql_extra', 'where'); foreach ($keys as $key) { if (!isset($complemento->$key)) { $complemento->$key = ''; } }
- La función comienza verificando que las claves esperadas dentro de
-
Inicialización de los parámetros en
$complemento->params
:- Si el objeto
$complemento
no contiene la propiedadparams
, se crea como un nuevo objetostdClass
. Luego, se verifica que las claves necesarias dentro deparams
estén definidas (group_by
,limit
,offset
,order
) y se inicializan como cadenas vacías si es necesario.
if (!isset($complemento->params)) { $complemento->params = new stdClass(); } $keys = array('group_by', 'limit', 'offset', 'order'); foreach ($keys as $key) { if (!isset($complemento->params->$key)) { $complemento->params->$key = ''; } }
- Si el objeto
-
Construcción de la consulta SQL:
- La función concatena las diferentes partes de la consulta SQL utilizando los valores proporcionados por el objeto
$complemento
. Se concatenan las cláusulasWHERE
, filtros especiales, cláusulasIN
,NOT IN
, y otras partes comoGROUP BY
,LIMIT
, yOFFSET
.
$sql = $consulta_previa . $complemento->where . $complemento->sentencia . ' ' . $complemento->filtro_especial . ' '; $sql .= $complemento->filtro_rango . ' ' . $complemento->filtro_fecha . ' '; $sql .= $complemento->filtro_extra . ' ' . $complemento->in . ' ' . $complemento->not_in . ' '; $sql .= $complemento->diferente_de . ' ' . $complemento->sql_extra . ' '; $sql .= $complemento->params->group_by . ' ' . $complemento->params->order . ' '; $sql .= $complemento->params->limit . ' ' . $complemento->params->offset;
- La función concatena las diferentes partes de la consulta SQL utilizando los valores proporcionados por el objeto
-
Limpieza de espacios en blanco:
- La consulta SQL resultante puede contener espacios innecesarios debido a la concatenación de cadenas. Para resolver esto, la función utiliza
str_replace
para eliminar espacios duplicados y ajustar la sintaxis de la consulta.
$sql = str_replace(' ', ' ', $sql); $sql = str_replace('( (', '((', $sql); return str_replace(' ', ' ', $sql);
- La consulta SQL resultante puede contener espacios innecesarios debido a la concatenación de cadenas. Para resolver esto, la función utiliza
-
Retorno de la consulta SQL:
- La función devuelve la consulta SQL ajustada y lista para ser ejecutada.
return str_replace(' ', ' ', $sql);
Ejemplo de uso
$complemento = new stdClass();
$complemento->where = "WHERE id = 1";
$complemento->filtro_especial = "AND estatus = 'activo'";
$complemento->params = new stdClass();
$complemento->params->group_by = "GROUP BY nombre";
$complemento->params->limit = "LIMIT 10";
$complemento->params->offset = "OFFSET 0";
$consulta_previa = "SELECT * FROM usuarios ";
$resultado = $this->sql($complemento, $consulta_previa);
// Resultado esperado:
// SELECT * FROM usuarios WHERE id = 1 AND estatus = 'activo' GROUP BY nombre LIMIT 10 OFFSET 0
Código de la Función
private function sql(stdClass $complemento, string $consulta_previa): string
{
$keys = array('filtro_especial','filtro_extra','filtro_fecha','filtro_rango','in','not_in','diferente_de',
'sentencia', 'sql_extra','where');
foreach ($keys as $key){
if(!isset($complemento->$key)){
$complemento->$key = '';
}
}
if(!isset($complemento->params)){
$complemento->params = new stdClass();
}
$keys = array('group_by','limit','offset','order');
foreach ($keys as $key){
if(!isset($complemento->params->$key)){
$complemento->params->$key = '';
}
}
$sql = $consulta_previa.$complemento->where.$complemento->sentencia.' '. $complemento->filtro_especial.' ';
$sql.= $complemento->filtro_rango.' '.$complemento->filtro_fecha.' ';
$sql.= $complemento->filtro_extra.' '.$complemento->in.' '.$complemento->not_in.' ';
$sql.= $complemento->diferente_de.' '.$complemento->sql_extra.' ';
$sql.= $complemento->params->group_by.' '.$complemento->params->order.' ';
$sql.= $complemento->params->limit.' '.$complemento->params->offset;
$sql = str_replace(' ', ' ', $sql);
$sql = str_replace(' ', ' ', $sql);
$sql = str_replace(' ', ' ', $sql);
$sql = str_replace(' ', ' ', $sql);
$sql = str_replace('( (', '((', $sql);
return str_replace(' ', ' ', $sql);
}