administrador.base.orm.columnas.genera_columnas_extra - gamboamartin/administrador GitHub Wiki

genera_columnas_extra

La función genera_columnas_extra es una función pública que genera una cadena de columnas SQL adicionales basadas en las subconsultas definidas en el modelo. Filtra y organiza estas subconsultas según los parámetros proporcionados, permitiendo la construcción de una sentencia SQL más completa y personalizada.

Signatura


final public function genera_columnas_extra(array $columnas, modelo_base $modelo):array|string

Parámetros

  • array $columnas:
    Un array que contiene los nombres de las columnas o subconsultas que se desean incluir en la salida. Si este array contiene elementos, solo las subconsultas que coincidan con los nombres en este array serán incluidas en la salida.

  • modelo_base $modelo:
    Una instancia de la clase modelo_base que contiene las subconsultas definidas en su propiedad columnas_extra. Cada subconsulta en columnas_extra debe tener un nombre clave (sub_query) y una sentencia SQL asociada (sql).

Retorno

  • array|string:
    Retorna una cadena que representa las columnas SQL adicionales generadas y concatenadas. En caso de error, retorna un array de error generado por $this->error->error().

Explicación Detallada

  1. Inicialización de la cadena de columnas:

    • La función inicializa la variable $columnas_sql como una cadena vacía para almacenar las columnas adicionales generadas.
  2. Iteración sobre las subconsultas extra:

    • La función itera sobre cada subconsulta en modelo->columnas_extra, donde la clave es el nombre de la subconsulta ($sub_query) y el valor es la sentencia SQL asociada ($sql).
    • Se realizan las siguientes validaciones en cada iteración:
      • Si $columnas contiene elementos y $sub_query no está en $columnas, se omite esta subconsulta.
      • El nombre de la subconsulta ($sub_query) no debe ser numérico.
      • El nombre de la subconsulta ($sub_query) no debe estar vacío.
      • La sentencia SQL asociada ($sql) no debe estar vacía.
  3. Generación de la columna SQL:

    • Si las validaciones son exitosas, la función concatena la sentencia SQL con el alias correspondiente, utilizando la sintaxis AS para formar una columna SQL completa.
  4. Concatenación de columnas:

    • Las columnas generadas se concatenan en la variable $columnas_sql. Si es la primera columna generada, no se agrega una coma al inicio; si no, se agrega una coma para separar correctamente las columnas en la sentencia SQL.
  5. Retorno de las columnas generadas:

    • Si todas las subconsultas se generan con éxito, la función retorna la cadena completa de columnas SQL adicionales.

Ejemplos

$columnas = ['total_pedidos', 'ultima_compra'];
$modelo = new modelo_base();
$modelo->columnas_extra = [
    'total_pedidos' => '(SELECT COUNT(*) FROM pedidos WHERE usuario_id = usuarios.id)',
    'ultima_compra' => '(SELECT MAX(fecha) FROM compras WHERE usuario_id = usuarios.id)'
];

$resultado = $this->genera_columnas_extra($columnas, $modelo);

// Resultado esperado:
// '(SELECT COUNT(*) FROM pedidos WHERE usuario_id = usuarios.id) AS total_pedidos,
//  (SELECT MAX(fecha) FROM compras WHERE usuario_id = usuarios.id) AS ultima_compra'
// Un array de error si ocurre algún problema.

Código de la Función

final public function genera_columnas_extra(array $columnas, modelo_base $modelo):array|string
    {
        $columnas_sql = '';
        $columnas_extra = $modelo->columnas_extra;
        foreach ($columnas_extra as $sub_query => $sql) {
            if((count($columnas) > 0) && !in_array($sub_query, $columnas, true)) {
                continue;
            }
            if(is_numeric($sub_query)){
                return $this->error->error(mensaje: 'Error el key debe ser el nombre de la subquery',
                    data: $columnas_extra, es_final: true);
            }
            if((string)$sub_query === ''){
                return $this->error->error(mensaje:'Error el key no puede venir vacio', data: $columnas_extra,
                    es_final: true);
            }
            if((string)$sql === ''){
                return $this->error->error(mensaje:'Error el sql no puede venir vacio', data: $columnas_extra,
                    es_final: true);
            }
            $columnas_sql .= $columnas_sql === ''?"$sql AS $sub_query":",$sql AS $sub_query";
        }
        return $columnas_sql;
    }