Cómo usar múltiples bases de datos en Laravel


225

Quiero combinar múltiples bases de datos en mi sistema. La mayoría de las veces la base de datos es MySQL; pero puede diferir en el futuro, es decir, el administrador puede generar dichos informes, que es la fuente de uso del sistema de base de datos heterogéneo .

Entonces, mi pregunta es ¿Laravel proporciona alguna fachada para lidiar con tales situaciones? ¿O cualquier otro marco tiene capacidades más adecuadas para el problema?

Respuestas:


469

Usando .env> = 5.0 (probado en 5.5)

En .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

En 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: En mysql2caso de DB_username y DB_PASSWORD es el mismo, entonces usted puede utilizar env('DB_USERNAME')que se metioned en .envprimeras líneas.

Sin .env<5.0

Definir conexiones

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 qué conexión usar, simplemente ejecute el connection()método

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

Consultor de construcción

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

Elocuente

Establezca la $connectionvariable en su modelo

class SomeModel extends Eloquent {

    protected $connection = 'mysql2';

}

También puede definir la conexión en tiempo de ejecución mediante el setConnectionmétodo o el 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 ¡ Tenga cuidado al intentar construir relaciones con tablas en bases de datos! Es posible hacerlo, pero puede venir con algunas advertencias y depende de qué configuración de base de datos y / o base de datos tenga.


De Laravel Docs

Usar múltiples conexiones de base de datos

Al usar varias conexiones, puede acceder a cada una a connectiontravés del método de conexión en la DBfachada. Lo que se namepasa al connectionmétodo debe corresponder a una de las conexiones enumeradas en su config/database.phparchivo de configuración:

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

También puede acceder a la instancia de PDO subyacente sin procesar utilizando el método getPdo en una instancia de conexión:

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

Enlaces útiles

  1. Laravel 5 conexión de base de datos múltiple DESDE laracasts.com
  2. Conecte múltiples bases de datos en laravel FROM tutsnare.com
  3. Múltiples conexiones de base de datos en Laravel FROM fideloper.com

1
Puede usar class SomeModel extends Model { y también asegurarse de haber eliminado los valores de obtención del archivo env como env('DB_DATABASE', 'name')cuando crea una nueva matriz de configuración de DB en el archivo database.php como @sba ha mencionado
Sadee

1
Hola, estoy usando Lumen y para la parte de configuración de la base de datos, solo tengo el archivo ".env". No es database.php. Entonces, ¿cómo puedo solucionar esto?
Chanaka De Silva

1
@ChanakaDeSilva Simplemente cree una carpeta de configuración y un archivo database.php para Lumen. Aparentemente, Lumen revisa constantemente para ver si ese archivo existe y lo usará si es así.
Ecksters

2
Gracias hermano, creo que tomo este trabajo ahora; p
binar

1
@AbdullaNilam some1 vino a mí para hacer que la aplicación multidb primero pensara si no sé si es posible ahora sé que es simple; p
binar

12

En Laravel 5.1, especifica la conexión:

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

Por defecto, Laravel usa la conexión por defecto. Es simple, ¿no es así?

Lea más aquí: http://laravel.com/docs/5.1/database#accessing-connections


en Laravel 5.1, ¿qué pasa con Eloquent?
simo

1
@simo, mira la respuesta de Abdulla.
schellingerht

He escrito un artículo completo para Sam, puede consultarlo en <a href=" stackcoder.in/posts/… 7.x Conexiones de bases de datos múltiples, Migraciones, Relaciones y consultas</a>
Channaveer Hakari

6

En realidad, DB::connection('name')->select(..)no funciona para mí, porque 'nombre' tiene que estar entre comillas dobles: "nombre"

Aún así, la consulta de selección se ejecuta en mi conexión predeterminada. Aún tratando de descubrir cómo convencer a Laravel para que funcione de la manera prevista: cambie la conexión.

Editar: lo descubrí. Después de depurar Laravels DatabaseManager resultó que mi database.php (archivo de configuración) (dentro de $ this-> app) estaba mal. En la sección "conexiones" tenía cosas como "base de datos" con valores de la copia. En términos claros, en lugar de

env('DB_DATABASE', 'name')

Necesitaba colocar algo como

'myNewName'

dado que todas las conexiones se enumeraron con los mismos valores para la base de datos, nombre de usuario, contraseña, etc., lo que por supuesto tiene poco sentido si quiero acceder al menos a otro nombre de base de datos

Por lo tanto, cada vez que quería seleccionar algo de otra base de datos, siempre terminaba en mi base de datos predeterminada


1
¡Gracias! Me salvaste la cordura. Traté de averiguar por qué todas mis consultas se referían a la base de datos predeterminada. Luego leí tu publicación y me di cuenta de que env siempre devolvía los valores .env y que el segundo parámetro era solo una alternativa que Laravel no usaba.
Moha

Fuera de tema: sería genial si los administradores no manipularan mis publicaciones. O al menos escríbeme un mensaje privado sobre qué y por qué quieren cambiar. No descubrí cómo enviar mensajes privados.
sba

Tuve un problema similar, cambié el valor pero no la clave. Funcionó así: 'database' => env ('DB_NEW_DATABASE', 'myNewDatabase'). ¡Debidamente notificado!
Fellipe Sanches

0

Laravel tiene soporte incorporado para múltiples sistemas de bases de datos, debe proporcionar detalles de conexión en el archivo config / database.php

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,
        ],
];

Una vez que tenga esto, puede crear dos clases de modelo base para cada conexión y definir el nombre de la conexión en esos modelos

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

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

Puede ampliar estos modelos para crear más modelos para tablas en cada DB.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.