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

  1. 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 = '';
        }
    }
    
  2. Inicialización de los parámetros en $complemento->params:

    • Si el objeto $complemento no contiene la propiedad params, se crea como un nuevo objeto stdClass. Luego, se verifica que las claves necesarias dentro de params 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 = '';
        }
    }
    
  3. 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áusulas WHERE, filtros especiales, cláusulas IN, NOT IN, y otras partes como GROUP BY, LIMIT, y OFFSET.
    $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;
    
  4. 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);
    
  5. 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);
    }