administrador.base.orm.where.genera_in_sql - gamboamartin/administrador GitHub Wiki

genera_in_sql

La función genera_in_sql es una función privada que genera una cláusula SQL IN a partir de un array que contiene una llave (nombre de columna) y un conjunto de valores. La función valida que el array contenga las claves requeridas, que los valores sean un array, y luego genera la cláusula SQL IN. Además, se encarga de limpiar espacios dobles en la cadena SQL resultante y de ajustar la sintaxis para evitar problemas en la consulta.

Signatura


private function genera_in_sql(array $in): array|string

Parámetros

  • array $in:
    Un array asociativo que debe contener las claves llave (nombre del campo o columna) y values (un array de valores que se utilizarán en la cláusula IN).

Retorna

  • array|string:
    Retorna la cláusula SQL IN generada como una cadena si la validación es exitosa. En caso de error, retorna un array de error generado por $this->error->error().

Explicación Detallada

  1. Validación del contenido del array $in:

    • Si el array $in contiene elementos, la función procede a realizar las validaciones necesarias. De lo contrario, retorna una cadena vacía.
  2. Validación de las claves en el array $in:

    • La función utiliza valida_existencia_keys() para verificar que el array $in contenga las claves llave y values.
    • Si alguna clave falta, se genera un mensaje de error y se retorna un array con el mensaje de error.
  3. Verificación del tipo de $values:

    • La función verifica que el valor asociado a la clave values sea un array. Si no lo es, se genera un mensaje de error y se retorna un array con el mensaje de error.
  4. Generación de la cláusula SQL IN:

    • La función llama a genera_in() para construir la cláusula SQL IN utilizando la llave y la lista de valores extraídos.
    • Si ocurre un error durante la generación de la cláusula SQL, se genera un mensaje de error y se retorna un array con el mensaje de error.
  5. Limpieza de espacios dobles en la cláusula SQL:

    • La función llama a limpia_espacios_dobles() para eliminar cualquier espacio doble innecesario en la cláusula SQL generada.
    • Si ocurre un error durante la limpieza, se genera un mensaje de error y se retorna un array con el mensaje de error.
  6. Ajuste de la sintaxis SQL:

    • La función reemplaza cualquier aparición de '( (' por '(( en la cláusula SQL generada para evitar problemas de sintaxis en la consulta.
  7. Retorno de la cláusula SQL:

    • Finalmente, la función retorna la cadena con la cláusula SQL IN generada y limpiada.

Ejemplos

$in = [
    'llave' => 'id_producto',
    'values' => ['100', '200', '300']
];

$resultado = $this->genera_in_sql($in);

// Resultado esperado:
// "id_producto IN ('100', '200', '300')"

Código de la Función

private function genera_in_sql(array $in): array|string
    {
        $in_sql = '';
        if(count($in)>0){
            $keys = array('llave','values');
            $valida = $this->validacion->valida_existencia_keys(keys: $keys, registro: $in);
            if(errores::$error){
                return $this->error->error(mensaje: 'Error al validar in',data: $valida);
            }
            $values = $in['values'];

            if(!is_array($values)){
                return $this->error->error(mensaje: 'Error values debe ser un array',data: $values, es_final: true);
            }
            $in_sql = $this->genera_in(in: $in);
            if(errores::$error){
                return $this->error->error(mensaje: 'Error al generar sql',data: $in_sql);
            }
            $in_sql = (new sql())->limpia_espacios_dobles(txt: $in_sql);
            if(errores::$error){
                return $this->error->error(mensaje: 'Error al limpiar sql',data: $in_sql);
            }

            $in_sql = str_replace('( (', '((', $in_sql);

        }
        $in_sql = (new sql())->limpia_espacios_dobles(txt: $in_sql);
        if(errores::$error){
            return $this->error->error(mensaje: 'Error al limpiar sql',data: $in_sql);
        }

        return str_replace('( (', '((', $in_sql);
    }