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 clasemodelo_base
que contiene las subconsultas definidas en su propiedadsub_querys
. Cada subconsulta ensub_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
-
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.
- La función inicializa la variable
-
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.
- La función itera sobre cada subconsulta en
-
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.
- La función llama a
-
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.
- Las subconsultas generadas se concatenan en la variable
-
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;
}