En esta página:
Demo Github
El popular Framework para Desarrollar proyectos bajo el Lenguaje de Programación PHP me refiero a Laravel, no cuenta consigo con un comando nativo para crear una Base de Datos, hasta la fecha de este tutorial al menos Laravel no cuenta con un comando que haga esta tarea, sin embargo Laravel nos permite crear comandos personalizados para una determinada tarea que necesitemos hacer, entendido esto en este artículo te voy a enseñar a Crear una Base de Datos mediante una comando personalizado, vamos con el tutorial.
Lo primero que haremos es crear un comando personalizado en Laravel 5.8, para esto Abre tu consola de Comandos y ejecuta el siguiente comando
1 2 3 4 5 |
php artisan make:command CrearmiBasedeDatos Console command created successfully. |
Puedes ver que Laravel cuenta con el comando php artisan make:command el cual nos permite crear un comando personalizado, al final del comando he colocado el nombre de mi comando personalizado el cual es CrearmiBasedeDatos
Luego de ejecutar el comando se ha creado un archivo llamado CrearmiBasedeDatos.php este archivo se encuentra en app > Console > Commands > CrearmiBasedeDatos.php (Abre este archivo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
/miaplicacionlaravel ├── /app ├── /Console ├── /Commands ├── CrearmiBasedeDatos.php // Abre este Archivo ├── /bootstrap ├── /config ├── /database ├── /hooks ├── /public ├── /resources ├── /routes ├── /storage ├── /tests ├── /vendor ├── .editorconfig ├── .env ├── .env.example ├── .gitattributes ├── .gitignore ├── .styleci.yml ├── artisan ├── composer.json ├── composer.lock ├── package.json ├── phpunit.xml ├── server.php ├── webpack.mix.js ├── yarn.lock |
En el archivo CrearmiBasedeDatos.php voy a colocar el código de mi comando con los argumentos y tareas que este va realizar, en este caso la tarea que va a realizar será crear una Base de Datos. Mencionar que estoy usando el motor de Base de Datos MySQL el cual es el más optimo para trabajar con PHP.
Configurando mi comando Personalizado
Bien dentro del archivo CrearmiBasedeDatos.php tengo una variable creada por defecto llamada $signature dentro de ella voy a definir el comando que debe ejecutare en la consola de comandos para crear la Base de Datos
Le voy a colocar tres valores que son nombrebd, tipo y cotejamiento
1 2 3 |
protected $signature = 'make:database {nombrebd} {tipo?} {cotejamiento?} '; |
Luego tengo otra variable creada por defecto llamada $description, dentro de esta variable sencillamente voy a describir que tarea realiza mi comando
1 2 3 |
protected $description = 'Este comando crea una Base de Datos'; |
También se nos ha creado la función handle() por defecto, dentro de esta voy a crear un try – catch dentro del try voy a colocar el código que va realizar la creación de la Base de Datos.
voy a crear 3 variables las cuales hacen mención o tienen los mismos nombres de cada argumento de mi comando los cuales son nombrebd, tipo y cotejamiento
1 2 3 4 5 |
$nombrebd = $this->argument('nombrebd'); $tipo = $this->hasArgument('tipo') && $this->argument('tipo') ? $this->argument('tipo'): DB::connection()->getPDO->getAttribute(PDO::ATTR_DRIVER_NAME); $cotejamiento = $this->argument('cotejamiento'); |
A la variable $nombrebd le asigno el argumento nombrebd y la variable $cotejamiento le asigno igualmente el argumento cotejamiento
A mi variable $tipo le voy asignar el argumento tipo y también voy a leer el motor de Base de Datos que tengo, en este caso debería leer MySQL, lo hago con la constante definida ATTR_DRIVER_NAME que lee y me devuelve el controlador o motor de Base de Datos con el que cuento en mi servidor.
Luego voy a usar un switch y le paso la variable $cotejamiento, en este switch voy a crear argumentos de cotejamientos de caracteres para la Base de Datos que mi comando va a crear
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
switch ($cotejamiento) { case 'utf8': $cot = "CHARACTER SET utf8 COLLATE utf8_general_ci"; break; case 'utf8-unicode': $cot = "CHARACTER SET utf8 COLLATE utf8_unicode_ci"; break; case 'utf8mb4': $cot = "CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci"; break; case 'utf8mb4-unicode': $cot = "CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"; break; default: $cot = "CHARACTER SET utf8 COLLATE utf8_general_ci"; break; } |
En el switch anterior, lo que hace es que si en la consola de comandos le indico que cree mi base de datos según el cotejamiento que le asigne, por ejemplo si le asigno el cotejamiento utf8mb4-unicode, entonces me ejecutará el comando CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci cuando se lleve a cabo la creación de mi Base de Datos.
Por último voy a proceder a crear la Base de Datos y mediante if – else verifico si es que la Base de Datos ya existe, si es así que me muestre un mensaje que diga: La Base de Datos con el nombre ‘$nombrebd’ ya existe ! y si no existe pues que proceda con la creación de la Base de Datos
1 2 3 4 5 6 7 8 9 10 11 |
$crearbd = DB::connection($tipo)->select("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = "."'".$nombrebd."'"); if(empty($crearbd)) { DB::connection($tipo)->select('CREATE DATABASE '. $nombrebd .' '.$cot); $this->info("La Base de Datos '$nombrebd' de tipo '$tipo' con Cotejamiento '$cot' ha sido creada Correctamente ! "); } else { $this->info("La Base de Datos con el nombre '$nombrebd' ya existe ! "); } |
En la parte superior voy a llamar al Trait DB para poder usar la Base de datos y el PDO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php namespace App\Console\Commands; use Illuminate\Console\Command; use DB; // instancio este Trait Database class CrearmiBasedeDatos extends Command { ... ... ... } |
Eso es todo, finalmente dentro del catch lanzo una excepción
1 2 3 4 5 |
catch (\Exception $e) { $this->error($e->getMessage()); } |
A continuación el código completo de mi archivo CrearmiBasedeDatos.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
<?php namespace App\Console\Commands; use Illuminate\Console\Command; use DB; // Trait Database class CrearmiBasedeDatos extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'make:database {nombrebd} {tipo?} {cotejamiento?} '; /** * The console command description. * * @var string */ protected $description = 'Este comando crea una Base de Datos'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return mixed */ public function handle() { try { $nombrebd = $this->argument('nombrebd'); $tipo = $this->hasArgument('tipo') && $this->argument('tipo') ? $this->argument('tipo'): DB::connection()->getPDO->getAttribute(PDO::ATTR_DRIVER_NAME); $cotejamiento = $this->argument('cotejamiento'); switch ($cotejamiento) { case 'utf8': $cot = "CHARACTER SET utf8 COLLATE utf8_general_ci"; break; case 'utf8-unicode': $cot = "CHARACTER SET utf8 COLLATE utf8_unicode_ci"; break; case 'utf8mb4': $cot = "CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci"; break; case 'utf8mb4-unicode': $cot = "CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"; break; default: $cot = "CHARACTER SET utf8 COLLATE utf8_general_ci"; break; } // Referencia: https://stackoverflow.com/questions/38832166/how-to-create-a-mysql-db-with-laravel#answer-47316035 $crearbd = DB::connection($tipo)->select("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = "."'".$nombrebd."'"); if(empty($crearbd)) { DB::connection($tipo)->select('CREATE DATABASE '. $nombrebd .' '.$cot); $this->info("La Base de Datos '$nombrebd' de tipo '$tipo' con Cotejamiento '$cot' ha sido creada Correctamente ! "); } else { $this->info("La Base de Datos con el nombre '$nombrebd' ya existe ! "); } } catch (\Exception $e) { $this->error($e->getMessage()); } } } |
Registro del Comando en Laravel
Ya tenemos creado nuestro comando, pero Laravel 5.8 nos pide que lo registremos en el core de comandos, para esto abre el archivo Kernel.php el cual se encuentra en app > Console > Kernel.php (Abre este archivo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
/miaplicacionlaravel ├── /app ├── /Console ├── /Commands ├── Kernel.php // Abre este Archivo ├── /bootstrap ├── /config ├── /database ├── /hooks ├── /public ├── /resources ├── /routes ├── /storage ├── /tests ├── /vendor ├── .editorconfig ├── .env ├── .env.example ├── .gitattributes ├── .gitignore ├── .styleci.yml ├── artisan ├── composer.json ├── composer.lock ├── package.json ├── phpunit.xml ├── server.php ├── webpack.mix.js ├── yarn.lock |
En el archivo que he abierto Kernel.php dentro de la variable $commands voy a registrar mi comando que he creado
1 2 3 4 5 |
protected $commands = [ Commands\CrearmiBasedeDatos::class ]; |
Eso es todo, ya puedo ejecutar el comando para crear una Base de Datos.
Comando Personalizado
Bien si abro mi consola de comandos debo de ejecutar los argumentos de mi comando creado, entonces debo de ejecutar el comando
1 2 3 4 5 6 |
php artisan make:database zapatos mysql utf8mb4-unicode La Base de Datos 'zapatos' de tipo 'mysql' con Cotejamiento 'CHARACTER SET utf8m b4 COLLATE utf8mb4_unicode_ci' ha sido creada Correctamente ! |
En donde:
- zapatos: Es el nombre de la Base de Datos
- mysql: Es el tipo o motor de Base de Datos
- utf8mb4-unicode: Es el cotejamiento de la Base de Datos
Reviso mi phpMyAdmin puedo ver que se me ha creado la base de datos zapatos con el cotejamiento utf8mb4-unicode
Espero que te sirva de mucho este tutorial y se te haga menos complicado la creación de Bases de Datos con Laravel.
Video
Si deseas una guía mas detallada para crear paso a paso este Comando para Crear una Base de Datos en Laravel 5.8 te dejo este video que se encuentra en mi canal de Youtube junto con otros tutoriales y contenidos
Notas
- Los Pasos y opciones mencionadas en este capitulo del tutorial pueden cambiar, esto no depende de nosotros, si no de la empresa que da soporte a Laravel, que suele cambiar sus opciones en futuras versiones.
Síguenos en nuestras Redes Sociales para que no te pierdas nuestros próximos contenidos.