En este tutorial conoceremos una forma de conectar una aplicación en Laravel con tres bases de datos diferentes, 2 en MySQL y 1 en PostgreSQL, una vez realizada la configuración en el proyecto, nos conectaremos independientemente a cada base de datos para extraer información y mostrarlos en pantalla.
Necesitamos:
Nivel: Intermedio
Paso 1. Base de datos
En este tutorial, utilizaremos 3 bases de datos, 2 en MySQL y 1 en PostgreSQL, los nombres son laravel_dba, laravel_dbb y laravel_dbc (perdón por la falta de imaginación). Todas las bases de datos tendrán la misma tabla con los mismos campos, esto para hacer el post más corto y entendible, obviamente en una aplicación real las bases de datos son independientes y pueden contener las tablas y campos que se requieran.
Por el momento solo se necesita crear las bases tanto en phpmyadmin como en pgadmin. Las tablas, campos y datos se crearan más adelante desde Laravel.
Paso 2. Variables de entorno (*.env)
El archivo *.env de Laravel nos proporciona las variables necesarias para configurar la conexión a una base de datos, sin embargo podemos modificar el mismo para «n» base de datos. Veamos como:
A: Corresponde a la conexión a base de datos por defecto de Laravel (mysql) , introducimos los datos de configuración para nuestra primer base de datos como lo hacemos en cualquier otro proyecto.
B: Nuestra segunda base de datos, también esta en MySQL y utiliza los mismos datos de conexión que la primera, por lo que no es necesarios repetirlos, solo nos interesa especificar el nombre de la segunda base de datos, el cual es «laravel_dbb».
C: La última base de datos que utilizaremos esta en PostgreSQL, por lo cual requiere su propia configuración, introducimos los mismos en variables copiados de la primera conexión «A» pero añadimos terminaciones en _PG para poder diferenciarlos e identificarlos mejor.
Paso 2. database.php
Abrimos el archivo database.php de la carpeta config/ y podremos observar que la primera conexión a mysql prácticamente ya esta hecha por lo que no debemos tocar nada más.
Para la segunda conexión, también en MySQL, solo debemos copiar el código (conexión a mysql) anterior y realizar dos pequeños cambios. 1. La nueva conexión se llamara «mysql2«, o puede tener el nombre que quieras. Lo siguiente es indicar el nombre de la base de datos con DB_DATABASE2, variable que creamos en *.env.
Finalmente para la tercera conexión a PostgreSQL (pgsql), solo debemos cambiar los parámetros de conexión por las variables creadas en *.env y terminadas en _PG.
Con todo esto ya tenemos configurado 3 conexiones a 3 bases de datos diferentes en Laravel, sin embargo el sistema solo utilizara la primera conexión por default ‘mysql‘ (línea 16), por lo que a continuación veremos como utilizar cada conexión independientemente.
Paso 3. Modelo y Controlador
Creamos un Controlador de recursos StudentController y un modelo Student.
Paso 4. Creación de Tabla Student y datos de prueba
Creamos una nueva migración con el nombre de CreateStudentsTable y añadimos el siguiente código en up():
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateStudentsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::connection('mysql')->create('students', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); }); Schema::connection('mysql2')->create('students', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); }); Schema::connection('pgsql')->create('students', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { // } }
Explicación: Creamos una tabla «Students» para cada conexión indicando el nombre y campos de la misma. La composición de la tabla no es relevante para el objetivo de este post y esta compuesto por un campo ID, name y timestamps.
A continuación creamos un Studentfactory con el siguiente código:
<?php use Faker\Generator as Faker; $factory->define(\App\Student::class, function (Faker $faker) { return [ 'name' => $faker->name ]; });
Finalmente creamos un StudentsTableSeeder y utilizamos el factory para crear datos de prueba para cada base de datos.
<?php use Illuminate\Database\Seeder; use App\Student; class StudentsTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { factory(Student::class, 10)->connection('mysql')->create(); factory(Student::class, 10)->connection('mysql2')->create(); factory(Student::class, 10)->connection('pgsql')->create(); } }
El seeder del estudiante, debemos llamarlo desde el DatabaseSeeder de la siguiente manera:
<?php use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { $this->call(StudentsTableSeeder::class); } }
Abrimos una consola y ejecutamos «php artisan migrate –seed», se crearan las tablas y datos en cada base de datos. Si tienes algún problema, revisa los pasos anteriores y si no, podrás ver algo como esto:
Paso 5. Test
Para terminar el tutorial, debemos implementar las llamadas a las conexiones en el controlador y mostrar los datos en la vista, para ello:
En la carpeta resources, renombra el archivo welcome.blade.php por index.blade.php y coloca el siguiente código:
<!doctype html> <html lang="{{ app()->getLocale() }}"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Laravel</title> </head> <body> <h3>Conexión MySQL N°1 (default)<h3> <table> <thead> <tr> <th>ID</th> <th>Nombre</th> </tr> </thead> <tbody> @foreach($students as $student) <tr> <th>{{ $student->id }}</th> <td>{{ $student->name }}</td> </tr> @endforeach </tbody> </table> <h3>Conexión MySQL N°2<h3> <table> <thead> <tr> <th>ID</th> <th>Nombre</th> </tr> </thead> <tbody> @foreach($students2 as $student2) <tr> <th>{{ $student2->id }}</th> <td>{{ $student2->name }}</td> </tr> @endforeach </tbody> </table> <h3>Conexión PgSQL N°3<h3> <table> <thead> <tr> <th>ID</th> <th>Nombre</th> </tr> </thead> <tbody> @foreach($students3 as $student3) <tr> <th>{{ $student3->id }}</th> <td>{{ $student3->name }}</td> </tr> @endforeach </tbody> </table> </body> </html>
Básicamente la vista esta compuesta por 3 tablas para cada conexión las cuales reciben un array con los datos de los estudiantes.
Ahora en el archivo web.php de la carpeta routes coloca:
Route::get('/', 'StudentsController@index');
Finalmente en StudentsController, en la función index() coloca:
public function index() { $students = Student::get(); $students2 = Student::on('mysql2')->get(); $students3 = Student::on('pgsql')->get(); return view('index', ['students' => $students, 'students2' => $students2, 'students3' => $students3]); }
Explicación: Cuando utilizamos la conexión por defecto de laravel, emplea la primera conexión «mysql«, si necesitamos emplear otras bases de datos, debemos indicar el nombre de la conexión ya sea para «mysql2» o «pgsql«.
Eso es todo.
enjoy!
¿Que es la facturación electrónica? Una factura es un documento que sirve para describir el costo de los servicios y des[...]
Me llego la siguiente duda por facebook que me pareció interesante: «Se quiere desarrollar una tabla en java que haga us[...]
En esta penúltima parte, declaramos las funciones que nos permitirán pintar los shapes en el canvas, vamos al grano que[...]
En este tutorial veremos como usar el componente Slider de JavaFX , capturas los cambios que realice el usuario y con es[...]
Código Único de Factura para el Nuevo Sistema de Facturación Electrónica en Bolivia desarrollado en el lenguaje PHP 7 (H[...]
El siguiente código te muestra una lista de los dispositivos de impresión que tenemos instalado en el sistema import jav[...]