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

sub_querys

La función sub_querys es una función pública que genera una cadena de subconsultas SQL, integrando múltiples subconsultas con sus respectivos alias. La función también permite filtrar las subconsultas basándose en una lista de columnas seleccionables.

Signatura


final public function sub_querys(string $columnas, modelo_base $modelo, array $columnas_seleccionables = array()):array|string

Parámetros

  • string $columnas:
    Una cadena que contiene las columnas SQL principales que se van a utilizar en la consulta. Esta cadena se utiliza para determinar si se debe agregar una coma antes de concatenar las subconsultas generadas.

  • modelo_base $modelo:
    Una instancia de la clase modelo_base que contiene las subconsultas definidas en su propiedad sub_querys. Cada subconsulta en sub_querys debe tener un alias asociado.

  • array $columnas_seleccionables (opcional):
    Un array que contiene una lista de alias de subconsultas que son seleccionables. Si este array se proporciona y contiene elementos, solo las subconsultas con alias presentes en este array serán incluidas en el resultado final. El valor por defecto es un array vacío.

Retorno

  • array|string:
    Retorna una cadena que representa las subconsultas SQL 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 subconsultas:

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

    • La función itera sobre cada subconsulta en modelo->sub_querys, donde la clave es el alias y el valor es la subconsulta.
    • Se realizan las siguientes validaciones en cada iteración:
      • La subconsulta no debe estar vacía.
      • El alias no debe estar vacío y no debe ser un valor numérico.
      • Si se proporciona $columnas_seleccionables, solo se incluyen subconsultas cuyo alias esté presente en este array.
  3. Generación de la subconsulta con alias:

    • La función llama a sub_query_str() para generar la subconsulta SQL completa con su alias.
    • Si ocurre un error durante la generación de la subconsulta, se retorna un array de error.
  4. Concatenación de subconsultas:

    • Las subconsultas generadas se concatenan en la variable $sub_querys_sql. Si es necesario, se agrega una coma antes de la subconsulta para separar correctamente las columnas en la sentencia SQL.
  5. Retorno de las subconsultas generadas:

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

Ejemplos

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

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

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

Código de la Función

final public function sub_querys(
        string $columnas, modelo_base $modelo, array $columnas_seleccionables = array()):array|string
    {
        $sub_querys_sql = '';
        foreach($modelo->sub_querys as $alias => $sub_query){
            if($sub_query === ''){
                return $this->error->error(mensaje: "Error el sub query no puede venir vacio",
                    data: $modelo->sub_querys, es_final: true);
            }
            if(trim($alias) === ''){
                return $this->error->error(mensaje:"Error el alias no puede venir vacio", data:$modelo->sub_querys,
                    es_final: true);
            }
            if(is_numeric($alias)){
                return $this->error->error(mensaje:"Error el alias no puede ser un numero", data:$modelo->sub_querys,
                    es_final: true);
            }
            if((count($columnas_seleccionables) > 0) && !in_array($alias, $columnas_seleccionables, true)) {
                continue;
            }
            $sub_query_str = $this->sub_query_str(alias: $alias,sub_query:  $sub_query);
            if(errores::$error){
                return $this->error->error(mensaje:"Error generar subquery con alias", data:$sub_query_str);
            }

            $coma = '';
            if ($sub_querys_sql === '' && $columnas === '') {
                $coma = ' , ';
            }

            $sub_querys_sql .= $coma . $sub_query_str;
        }

        return $sub_querys_sql;
    }