crear migration en laravel
Tue Aug 26 2025 16:13:26 GMT+0000 (Coordinated Universal Time)
#!/bin/bash # Colores para output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' # No Color # Función para mostrar mensajes de error error() { echo -e "${RED}Error: $1${NC}" >&2 } # Función para mostrar mensajes de éxito success() { echo -e "${GREEN}$1${NC}" } # Función para mostrar advertencias warning() { echo -e "${YELLOW}Advertencia: $1${NC}" } # Función para mostrar información info() { echo -e "${BLUE}$1${NC}" } # Función para mostrar detalles detail() { echo -e "${CYAN}$1${NC}" } # Función para normalizar nombres (remover guiones bajos y convertir a minúsculas) normalizar_nombre() { echo "$1" | tr '[:upper:]' '[:lower:]' | sed 's/_//g' } # Función para obtener migraciones existentes obtener_migraciones_existentes() { local migraciones=() if [ -d "database/migrations" ]; then while IFS= read -r -d '' archivo; do # Extraer el nombre de la tabla del archivo de migración local nombre_archivo=$(basename "$archivo") # Buscar varios patrones comunes de migraciones if [[ "$nombre_archivo" =~ create_(.*)_table\.php ]] || [[ "$nombre_archivo" =~ _(.*)_table\.php ]] || [[ "$nombre_archivo" =~ create_(.*)\.php ]] || [[ "$nombre_archivo" =~ _(.*)\.php ]]; then migraciones+=("${BASH_REMATCH[1]}") fi done < <(find database/migrations -name "*.php" -print0 2>/dev/null) fi echo "${migraciones[@]}" } # Función para verificar si una migración ya existe (comparación normalizada) migracion_existe() { local tabla="$1" local migraciones_existentes=($(obtener_migraciones_existentes)) # Normalizar el nombre de la tabla a verificar local tabla_normalizada=$(normalizar_nombre "$tabla") for migracion in "${migraciones_existentes[@]}"; do # Normalizar el nombre de la migración existente local migracion_normalizada=$(normalizar_nombre "$migracion") if [ "$migracion_normalizada" == "$tabla_normalizada" ]; then return 0 # true - existe fi done return 1 # false - no existe } # Función para obtener el nombre real del archivo de migración existente obtener_nombre_archivo_existente() { local tabla="$1" local migraciones_existentes=($(obtener_migraciones_existentes)) local tabla_normalizada=$(normalizar_nombre "$tabla") for migracion in "${migraciones_existentes[@]}"; do local migracion_normalizada=$(normalizar_nombre "$migracion") if [ "$migracion_normalizada" == "$tabla_normalizada" ]; then # Encontrar el archivo real archivo_existente=$(find database/migrations -name "*${migracion}*" -print -quit 2>/dev/null) if [ -n "$archivo_existente" ]; then echo "$(basename "$archivo_existente")" return fi fi done echo "" } # Función para verificar si una palabra está en plural (inglés y español) es_plural() { local palabra="$1" local palabra_lower=$(echo "$palabra" | tr '[:upper:]' '[:lower:]') # Reglas para plural en inglés local plural_ingles=( "s$" "es$" "ies$" "ves$" "xes$" "zes$" "ches$" "shes$" ) # Reglas para plural en español local plural_espanol=( "s$" "es$" "ces$" "ses$" "res$" "nes$" ) # Verificar reglas en inglés for regla in "${plural_ingles[@]}"; do if [[ "$palabra_lower" =~ $regla ]]; then return 0 # true - es plural fi done # Verificar reglas en español for regla in "${plural_espanol[@]}"; do if [[ "$palabra_lower" =~ $regla ]]; then return 0 # true - es plural fi done # Palabras comunes que son plurales local plurales_comunes=( "people" "children" "men" "women" "feet" "teeth" "mice" "geese" "data" "criteria" "phenomena" "personas" "gentes" "naciones" "usuarios" "personas" "productos" "categorias" "articulos" ) for plural in "${plurales_comunes[@]}"; do if [ "$palabra_lower" == "$plural" ]; then return 0 # true - es plural fi done return 1 # false - no es plural } # Función para sugerir plural en inglés (convención Laravel) sugerir_plural() { local palabra="$1" local idioma="${2:-en}" # default inglés # Convertir a minúsculas para procesamiento local palabra_lower=$(echo "$palabra" | tr '[:upper:]' '[:lower:]') local resultado="" if [ "$idioma" == "en" ]; then # Reglas de pluralización en inglés if [[ "$palabra_lower" =~ y$ ]] && ! [[ "$palabra_lower" =~ [aeiou]y$ ]]; then resultado="${palabra_lower%y}ies" elif [[ "$palabra_lower" =~ f$ ]]; then resultado="${palabra_lower%f}ves" elif [[ "$palabra_lower" =~ fe$ ]]; then resultado="${palabra_lower%fe}ves" elif [[ "$palabra_lower" =~ s$ ]] || [[ "$palabra_lower" =~ x$ ]] || [[ "$palabra_lower" =~ z$ ]] || [[ "$palabra_lower" =~ ch$ ]] || [[ "$palabra_lower" =~ sh$ ]]; then resultado="${palabra_lower}es" else resultado="${palabra_lower}s" fi else # Reglas básicas de pluralización en español if [[ "$palabra_lower" =~ [áéíóú]$ ]]; then resultado="${palabra_lower}es" elif [[ "$palabra_lower" =~ z$ ]]; then resultado="${palabra_lower%z}ces" elif [[ "$palabra_lower" =~ [aeiou]$ ]]; then resultado="${palabra_lower}s" elif [[ "$palabra_lower" =~ [bcdfghjklmnpqrstvwxyz]$ ]]; then resultado="${palabra_lower}es" else resultado="${palabra_lower}s" fi fi # Mantener capitalización original si la palabra comenzaba con mayúscula if [[ "$palabra" =~ ^[A-Z] ]]; then resultado="$(echo "${resultado:0:1}" | tr '[:lower:]' '[:upper:]')${resultado:1}" fi echo "$resultado" } # Mostrar migraciones existentes mostrar_migraciones_existentes() { local migraciones_existentes=($(obtener_migraciones_existentes)) if [ ${#migraciones_existentes[@]} -eq 0 ]; then info "No hay migraciones existentes en la carpeta database/migrations" else info "Migraciones existentes:" for migracion in "${migraciones_existentes[@]}"; do detail " - $migracion" done echo "" fi } # Función para solicitar nombre de tabla con todas las validaciones solicitar_nombre_tabla() { local numero_tabla="$1" local tablas_existentes=("$2") # Tablas ya ingresadas en esta sesión while true; do read -p "Ingrese el nombre de la tabla $numero_tabla: " nombre_tabla # Validar que no esté vacío if [ -z "$nombre_tabla" ]; then error "El nombre no puede estar vacío." continue fi # Validar formato if [[ ! "$nombre_tabla" =~ ^[a-zA-Z0-9_áéíóúÁÉÍÓÚñÑ]+$ ]]; then error "El nombre contiene caracteres no válidos." continue fi # Verificar si está en plural if ! es_plural "$nombre_tabla"; then warning "El nombre '$nombre_tabla' parece estar en singular." # Ofrecer sugerencias en inglés y español sugerencia_en=$(sugerir_plural "$nombre_tabla" "en") sugerencia_es=$(sugerir_plural "$nombre_tabla" "es") echo "Sugerencias:" echo " 1) Inglés (recomendado): $sugerencia_en" echo " 2) Español: $sugerencia_es" echo " 3) Mantener '$nombre_tabla'" read -p "Seleccione una opción (1/2/3): " opcion_plural case $opcion_plural in 1) nombre_tabla="$sugerencia_en" ;; 2) nombre_tabla="$sugerencia_es" ;; 3) info "Manteniendo: $nombre_tabla" ;; *) error "Opción no válida. Manteniendo nombre original." ;; esac fi # Verificar si la migración ya existe en el sistema (comparación normalizada) if migracion_existe "$nombre_tabla"; then warning "¡La migración para '$nombre_tabla' ya existe!" # Mostrar el archivo existente archivo_existente=$(obtener_nombre_archivo_existente "$nombre_tabla") if [ -n "$archivo_existente" ]; then detail "Archivo existente: $archivo_existente" fi # Pedir nuevo nombre inmediatamente read -p "Por favor, ingrese un nombre diferente: " nombre_tabla # Continuar el ciclo para validar el nuevo nombre continue fi # Verificar si ya fue ingresado en esta misma sesión (comparación normalizada) for tabla_existente in "${tablas_existentes[@]}"; do if [ "$(normalizar_nombre "$tabla_existente")" == "$(normalizar_nombre "$nombre_tabla")" ]; then warning "El nombre '$nombre_tabla' ya fue ingresado en esta sesión." read -p "Por favor, ingrese un nombre diferente: " nombre_tabla continue 2 fi done # Si llegamos aquí, el nombre es válido, no existe y no es duplicado echo "$nombre_tabla" break done } # Validar que estamos en un proyecto Laravel if [ ! -f "artisan" ]; then error "No se encontró el archivo artisan. Asegúrate de estar en el directorio raíz de un proyecto Laravel." exit 1 fi # Validar que PHP está disponible if ! command -v php &> /dev/null; then error "PHP no está instalado o no está en el PATH." exit 1 fi # Mostrar migraciones existentes al inicio mostrar_migraciones_existentes # Solicitar y validar la cantidad de tablas while true; do read -p "Ingrese la cantidad de tablas que desea crear: " cantidad_tablas if [[ ! "$cantidad_tablas" =~ ^[0-9]+$ ]]; then error "Por favor, ingrese un número válido." continue fi if [ "$cantidad_tablas" -lt 1 ]; then error "La cantidad debe ser al menos 1." continue fi break done # Inicializar arreglo para almacenar los nombres de las tablas tablas=() info "Convenciones de Laravel:" info "- Nombres de tablas en PLURAL (inglés preferido)" info "- Ejemplos: users, products, categories, posts, comments" info "- También se acepta español: usuarios, productos, categorías" # Solicitar los nombres de las tablas con validación inmediata for ((i=1; i<=cantidad_tablas; i++)); do nombre_tabla=$(solicitar_nombre_tabla $i "${tablas[@]}") tablas+=("$nombre_tabla") success "Tabla agregada: $nombre_tabla" done if [ ${#tablas[@]} -eq 0 ]; then warning "No se agregaron tablas para crear migraciones." exit 0 fi # Mostrar resumen antes de proceder echo -e "\n${YELLOW}Resumen de migraciones a crear:${NC}" for table in "${tablas[@]}"; do echo " - create_${table}_table" done # Confirmar antes de ejecutar read -p $'\n¿Desea continuar con la creación de las migraciones? (s/N): ' confirmar if [[ ! "$confirmar" =~ ^[SsYy]$ ]] && [ -n "$confirmar" ]; then warning "Operación cancelada por el usuario." exit 0 fi # Crear las migraciones echo -e "\nCreando migraciones..." for table in "${tablas[@]}"; do echo "Creando migración para: $table" if php artisan make:migration "create_${table}_table" --quiet; then success "✓ Migración para '$table' creada exitosamente." else error "✗ Error al crear la migración para '$table'" fi done # Mostrar migraciones actualizadas echo -e "\n" mostrar_migraciones_existentes success "¡Proceso completado! Se crearon ${#tablas[@]} migraciones."
Comments