administrador.base.orm.modelo_base.genera_consulta_base - gamboamartin/administrador GitHub Wiki

genera_consulta_base

La función genera_consulta_base es una función pública que genera la consulta SQL base para un modelo, integrando columnas, subconsultas, uniones (JOINs), y otras configuraciones especificadas. Es una función flexible que permite construir consultas SQL complejas de manera dinámica.

Signatura


final public function genera_consulta_base(array $columnas = array(), array $columnas_by_table = array(), bool $columnas_en_bruto = false, bool $con_sq = true, bool $count = false, array $extension_estructura = array(), array $extra_join = array(),  array $renombradas = array()):array|string

Parámetros

  • array $columnas (opcional):
    Un array que contiene los nombres de las columnas o subconsultas que se desean incluir en la consulta. El valor por defecto es un array vacío.

  • array $columnas_by_table (opcional):
    Un array que contiene los nombres de las tablas que se van a utilizar en la consulta SQL. Este array solo se debe utilizar si la lógica de columnas por tabla está habilitada. El valor por defecto es un array vacío.

  • bool $columnas_en_bruto (opcional):
    Un valor booleano que indica si las columnas deben ser procesadas en su forma original (true) o si deben ser ajustadas y personalizadas (false). El valor por defecto es false.

  • bool $con_sq (opcional):
    Un valor booleano que indica si se deben generar subconsultas (sub_querys) y columnas adicionales. Si es true, se generarán; si es false, no se generarán. El valor por defecto es true.

  • bool $count (opcional):
    Un valor booleano que indica si la salida final debe ser un conteo total de registros. Si es true, la cadena final de columnas será reemplazada por "COUNT(*) AS total_registros". El valor por defecto es false.

  • array $extension_estructura (opcional):
    Un array que define la estructura de extensión para la consulta SQL. Las claves del array son los nombres de las tablas y los valores contienen los datos específicos relacionados con la tabla. El valor por defecto es un array vacío.

  • array $extra_join (opcional):
    Un array que contiene información sobre columnas adicionales que se deben agregar a la consulta desde uniones (JOIN) extras. El valor por defecto es un array vacío.

  • array $renombradas (opcional):
    Un array que contiene las tablas y los nombres alternativos (renombres) que deben ser aplicados. Las claves del array son los nombres de las tablas, y los valores son arrays que contienen la información relacionada con el renombrado de columnas. El valor por defecto es un array vacío.

Retorno

  • array|string:
    Retorna una cadena que representa la consulta SQL base generada. En caso de error, retorna un array de error generado por $this->error->error().

Explicación Detallada

  1. Ajuste del nombre de la tabla:

    • La función elimina el prefijo models\ del nombre de la tabla para asegurar que esté en un formato adecuado para la consulta SQL.
  2. Obtención de las columnas completas:

    • La función llama a obten_columnas_completas() para obtener todas las columnas necesarias para la consulta. Si ocurre un error durante este proceso, se genera un mensaje de error y se retorna un array con el mensaje de error.
  3. Generación de las uniones (JOINs):

    • La función llama a tablas() desde una instancia de joins para generar las tablas y las uniones necesarias para la consulta. Si ocurre un error durante este proceso, se genera un mensaje de error y se retorna un array con el mensaje de error.
  4. Integración de las columnas finales:

    • La función llama a integra_columns_final() para combinar y generar la cadena final de columnas SQL. Si ocurre un error durante este proceso, se genera un mensaje de error y se retorna un array con el mensaje de error.
  5. Construcción y retorno de la consulta SQL:

    • Finalmente, la función construye la consulta SQL utilizando las columnas finales y las tablas generadas, y retorna la consulta como una cadena.

Ejemplos

$columnas = ['total_pedidos', 'ultima_compra'];
$columnas_by_table = ['usuarios', 'pedidos'];
$columnas_en_bruto = false;
$con_sq = true;
$count = false;
$extension_estructura = ['usuarios' => ['campo1', 'campo2']];
$extra_join = ['extra_campo' => 'valor_extra'];
$renombradas = ['usuarios' => ['renombre' => 'usuarios_activos']];

$resultado = $this->genera_consulta_base($columnas, $columnas_by_table, $columnas_en_bruto, $con_sq, $count, $extension_estructura, $extra_join, $renombradas);

// Resultado esperado:
// Una cadena que representa la consulta SQL base generada.
// Un array de error si ocurre algún problema.

Código de la Función

final public function genera_consulta_base(
        array $columnas = array(), array $columnas_by_table = array(), bool $columnas_en_bruto = false,
        bool $con_sq = true, bool $count = false, array $extension_estructura = array(), array $extra_join = array(),
        array $renombradas = array()):array|string
    {
        $this->tabla = str_replace('models\\','',$this->tabla);

        $columnas_seleccionables = $columnas;

        $columnas_sql = (new columnas())->obten_columnas_completas(modelo: $this,
            columnas_by_table: $columnas_by_table, columnas_en_bruto: $columnas_en_bruto,
            columnas_sql: $columnas_seleccionables, extension_estructura: $extension_estructura,
            extra_join: $extra_join, renombres: $renombradas);
        if(errores::$error){
            return  $this->error->error(mensaje: 'Error al obtener columnas en '.$this->tabla,data: $columnas_sql);
        }


        $tablas = (new joins())->tablas(columnas: $this->columnas, extension_estructura:  $extension_estructura,
            extra_join: $extra_join, modelo_tabla: $this->tabla, renombradas: $renombradas, tabla: $this->tabla);
        if(errores::$error){
            return $this->error->error(mensaje: 'Error al generar joins e '.$this->tabla, data: $tablas);
        }

        $columns_final = $this->integra_columns_final(columnas: $columnas,
            columnas_seleccionables:  $columnas_seleccionables,columnas_sql:  $columnas_sql,
            con_sq:  $con_sq,count:  $count);
        if(errores::$error){
            return $this->error->error(mensaje: 'Error al integrar columns_final', data: $columns_final);
        }

        return /** @lang MYSQL */ "SELECT $columns_final FROM $tablas";
    }