All Articles

Multiplos bancos de dados com Laravel

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'undefined 'mysql')undefined
/*** 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'undefined            'host' => env('DB_HOST'undefined '127.0.0.1')undefined            'port' => env('DB_PORT'undefined '3306')undefined            'database' => env('DB_DATABASE'undefined 'forge')undefined            'username' => env('DB_USERNAME'undefined 'forge')undefined            'password' => env('DB_PASSWORD'undefined '')undefined            'unix_socket' => env('DB_SOCKET'undefined '')undefined            'charset' => 'utf8mb4'undefined            'collation' => 'utf8mb4_unicode_ci'undefined            'prefix' => ''undefined            'strict' => trueundefined            'engine' => nullundefined        ]undefined
]undefined

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'undefined            'host' => env('DB_HOST_MYSQL2'undefined '127.0.0.1')undefined            'port' => env('DB_PORT_MYSQL2'undefined '3306')undefined            'database' => env('DB_DATABASE_MYSQL2'undefined '')undefined            'username' => env('DB_USERNAME_MYSQL2'undefined '')undefined            'password' => env('DB_PASSWORD_MYSQL2'undefined '')undefined            'unix_socket' => env('DB_SOCKET'undefined '')undefined            'charset' => 'utf8mb4'undefined            'collation' => 'utf8mb4_unicode_ci'undefined            'prefix' => ''undefined            'strict' => trueundefined            'engine' => nullundefined        ]undefined

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'undefined 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.