Multiplos bancos de dados com Laravel

2 minuto(s) de leitura

Entre as diversas vantagens de se utilizar um framework como o Laravel, temos o conceito de Convensão sobre Configuração(Convention over Configuration ) onde o framework supõe e define por padrão diversas configurações mais comuns.

Uma dessas convenções é a configuração do banco, que já vem configurado para o Mysql. Se olharmos o arquivo de configuração do banco (app/config/database.php) veremos a definição do banco default da aplicação:

<?php

return [

    'default' => env('DB_CONNECTION', 'mysql'),

    /*** Restante do código omitido  **/

No código acima, o indice ‘default’ recebe o valor da constante DB_CONNECTION definida no arquivo .env, caso essa constante não for definida, o valor recebido será o do indice ‘mysql’ que é definido no próprio arquivo database.php. aqui temos a configuração de uma conexão:


'connections' => [

        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],

    ],


As convenções do Laravel por padrão assume que vamos utilizar somente um banco de dados mysql, para definir um segundo banco precisamos criar um outra configuração com as informações do novo banco:

 'mysql2' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST_MYSQL2', '127.0.0.1'),
            'port' => env('DB_PORT_MYSQL2', '3306'),
            'database' => env('DB_DATABASE_MYSQL2', ''),
            'username' => env('DB_USERNAME_MYSQL2', ''),
            'password' => env('DB_PASSWORD_MYSQL2', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],

No código, foram definidas novas constantes com a informação de host, porta, usuário e senha do novo banco (lembrando que essas constantes devem ser criadas no arquivo .env na raiz do projeto) e a configuração do novo banco no arquivo app/config/database.php.

Agora que temos uma nova configuração do banco podemos usa-la de diversas formas:

Passando a conexão para o Schema Builder

Uma das formas é informar para o Schema Builder qual a conexão deve ser usada:


<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        //Definindo a conexão
        Schema::connection('mysql2')->create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /*** Restante do código omitido  **/

Em uma consulta

Da mesma forma que no Schema Builder passamos para o método connection o nome da configuração:

$users = DB::connection('mysql2')->select(...);

Definindo a conexão no Model

Para fazer com que um model específico utilize um outro banco, basta definir a propriedade $connection :


<?php

class User extends Eloquent {

    protected $connection = 'mysql2';

}

Em tempo de execução

Em tempo de execução precisamos usar o método setConnection():

<?php

class UserController extends BaseController {

    public function findUser()
    {
        $user = new User;

        $user->setConnection('mysql2');

        $data['user'] = $user->find(1);

        return $data;
    }

}

Essas são as formas de se utilizar um segundo banco de dados com Laravel, espero que seja útil.

Atualizado em: