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 clasemodelo_base
que contiene las subconsultas definidas en su propiedadcolumnas_extra
. Cada subconsulta encolumnas_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
-
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.
- La función inicializa la variable
-
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.
- Si
- La función itera sobre cada subconsulta en
-
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.
- Si las validaciones son exitosas, la función concatena la sentencia SQL con el alias correspondiente, utilizando la sintaxis
-
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.
- Las columnas generadas se concatenan en la variable
-
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;
}