Como usar vários bancos de dados no Laravel


225

Eu quero combinar vários bancos de dados no meu sistema. Na maioria das vezes o banco de dados é MySQL; mas pode diferir no futuro, ou seja, o administrador pode gerar esses relatórios, que são a fonte de uso do sistema de banco de dados heterogêneo .

Então, minha pergunta é: o Laravel fornece alguma fachada para lidar com essas situações? Ou qualquer outra estrutura tem recursos mais adequados para o problema é?

Respostas:


469

Usando .env> = 5.0 (testado no 5.5)

No .env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database1
DB_USERNAME=root
DB_PASSWORD=secret

DB_CONNECTION_SECOND=mysql
DB_HOST_SECOND=127.0.0.1
DB_PORT_SECOND=3306
DB_DATABASE_SECOND=database2
DB_USERNAME_SECOND=root
DB_PASSWORD_SECOND=secret

No config/database.php

'mysql' => [
    'driver'    => env('DB_CONNECTION'),
    'host'      => env('DB_HOST'),
    'port'      => env('DB_PORT'),
    'database'  => env('DB_DATABASE'),
    'username'  => env('DB_USERNAME'),
    'password'  => env('DB_PASSWORD'),
],

'mysql2' => [
    'driver'    => env('DB_CONNECTION_SECOND'),
    'host'      => env('DB_HOST_SECOND'),
    'port'      => env('DB_PORT_SECOND'),
    'database'  => env('DB_DATABASE_SECOND'),
    'username'  => env('DB_USERNAME_SECOND'),
    'password'  => env('DB_PASSWORD_SECOND'),
],

Nota: Em mysql2caso DB_username e db_password é o mesmo, então você pode usar env('DB_USERNAME')que é metioned em .envprimeiras linhas.

Sem .env<5.0

Definir conexões

app/config/database.php

return array(

    'default' => 'mysql',

    'connections' => array(

        # Primary/Default database connection
        'mysql' => array(
            'driver'    => 'mysql',
            'host'      => '127.0.0.1',
            'database'  => 'database1',
            'username'  => 'root',
            'password'  => 'secret'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),

        # Secondary database connection
        'mysql2' => array(
            'driver'    => 'mysql',
            'host'      => '127.0.0.1',
            'database'  => 'database2',
            'username'  => 'root',
            'password'  => 'secret'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),
    ),
);

Esquema

Para especificar qual conexão usar, basta executar o connection()método

Schema::connection('mysql2')->create('some_table', function($table)
{
    $table->increments('id'):
});

Criador de consultas

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

Eloquente

Defina a $connectionvariável no seu modelo

class SomeModel extends Eloquent {

    protected $connection = 'mysql2';

}

Você também pode definir a conexão em tempo de execução por meio do setConnectionmétodo ou do onmétodo estático:

class SomeController extends BaseController {

    public function someMethod()
    {
        $someModel = new SomeModel;

        $someModel->setConnection('mysql2'); // non-static method

        $something = $someModel->find(1);

        $something = SomeModel::on('mysql2')->find(1); // static method

        return $something;
    }

}

Nota Tenha cuidado ao tentar criar relacionamentos com tabelas nos bancos de dados! É possível, mas pode ser fornecido com algumas ressalvas e depende de quais banco de dados e / ou configurações de banco de dados você possui.


Do Laravel Docs

Usando várias conexões de banco de dados

Ao usar várias conexões, você pode acessar cada uma delas connectionatravés do método de conexão na DBfachada. A namepassagem para o connectionmétodo deve corresponder a uma das conexões listadas no seu config/database.phparquivo de configuração:

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

Você também pode acessar a instância PDO bruta subjacente usando o método getPdo em uma instância de conexão:

$pdo = DB::connection()->getPdo();

Links Úteis

  1. Conexão com múltiplos bancos de dados do Laravel 5 laracasts.com
  2. Conecte vários bancos de dados no laravel tutsnare.com
  3. Várias conexões de banco de dados no Laravel fideloper.com

1
Você pode usar class SomeModel extends Model { e também ter certeza de que os valores são removidos do arquivo env como env('DB_DATABASE', 'name')quando você criar nova matriz de configuração DB em database.php arquivo como @sba mencionou
Sadee

1
Ei, estou usando o Lumen e, na parte de configuração do banco de dados, tenho apenas o arquivo ".env". Não é database.php. Então, como posso corrigir isso?
Chanaka De Silva

1
@ChanakaDeSilva Você acabou de criar uma pasta de configuração e um arquivo database.php para o Lumen. Aparentemente, o Lumen está constantemente verificando se esse arquivo existe e o utilizará se existir.
Ecksters

2
Obrigado mano, eu acho que aceito este trabalho agora; p
binar

1
@AbdullaNilam some1 veio a mim para fazer aplicativo multidb primeiro pensamento foi que eu não sei se é possível agora eu sei que é simples; p
binar

12

No Laravel 5.1, você especifica a conexão:

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

Por padrão, o Laravel usa a conexão padrão. É simples, não é?

Leia mais aqui: http://laravel.com/docs/5.1/database#accessing-connections


no Laravel 5.1, e o Eloquent?
Sim #

1
@simo, veja a resposta de Abdulla.
schellingerht

Eu escrevi um artigo completo para o sam. Você pode verificá-lo em <a href=" stackcoder.in/posts/… 7.x Múltiplas conexões de bancos de dados, migrações, relacionamentos e consultas</a>
Channaveer Hakari

6

Na verdade, DB::connection('name')->select(..)não funciona para mim, porque 'name' deve estar entre aspas duplas: "name"

Ainda assim, a consulta de seleção é executada na minha conexão padrão. Ainda tentando descobrir, como convencer o Laravel a funcionar da maneira que ele pretende: mudar a conexão.

Edit: Eu descobri isso. Após depurar o Laravels DatabaseManager, meu database.php (arquivo de configuração) (dentro de $ this-> app) estava errado. Na seção "conexões", eu tinha coisas como "banco de dados", com valores dos quais eu os copiei. Em termos claros, em vez de

env('DB_DATABASE', 'name')

Eu precisava colocar algo como

'myNewName'

uma vez que todas as conexões foram listadas com os mesmos valores para o banco de dados, nome de usuário, senha etc., o que obviamente faz pouco sentido se eu quiser acessar pelo menos outro nome de banco de dados

Portanto, toda vez que eu queria selecionar algo de outro banco de dados, eu sempre acabava no meu banco de dados padrão.


1
Obrigado! Você salvou minha sanidade. Tentei descobrir por que todas as minhas consultas se referiam ao banco de dados padrão. Depois li o seu post e percebi que o env sempre retornava os valores .env e o segundo parâmetro era apenas um substituto que o Laravel não usava.
Moha 14/10

Fora do tópico: seria ótimo se os administradores não manipularem minhas postagens. Ou pelo menos me escreva uma mensagem privada, o que e por que eles querem mudar. Eu não descobri como enviar mensagens privadas.
sba

Eu tive um problema semelhante, alterei o valor, mas não a chave. Funcionou assim: 'database' => env ('DB_NEW_DATABASE', 'myNewDatabase'). Bem notado!
Fellipe Sanches

0

Laravel tem suporte embutido para vários sistemas de banco de dados, você precisa fornecer detalhes de conexão em config / database.php arquivo

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

    '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', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
        ],
'mysqlOne' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST_ONE', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE_ONE', 'forge'),
            'username' => env('DB_USERNAME_ONE', 'forge'),
            'password' => env('DB_PASSWORD_ONE', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
        ],
];

Depois disso, você poderá criar duas classes de modelo base para cada conexão e definir o nome da conexão nesses modelos.

//BaseModel.php
protected $connection = 'mysql';

//BaseModelOne.php
protected $connection = 'mysqlOne';

Você pode estender esses modelos para criar mais modelos para tabelas em cada banco de dados.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.