web-dev-qa-db-fra.com

Comment utiliser plusieurs bases de données dans Laravel

Je veux combiner plusieurs bases de données dans mon système. La plupart du temps, la base de données est MySQL. mais cela peut différer à l’avenir, c’est-à-dire que l’Administrateur peut générer un tel rapport qui est tiliser une source hétérogène système de base de données.

Ma question est donc Laravel fournit-il une façade? pour faire face à de telles situations? Ou tout autre cadre ayant des capacités plus appropriées pour le problème est?

165
Chintan7027

Utilisation de _.env_> = 5.0 (testé sur la version 5.5)

Dans _.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
_

Dans _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'),
],
_

Remarque: Dans _mysql2_ si DB_username et DB_password sont identiques, vous pouvez utiliser env('DB_USERNAME') qui est mis en métrique dans _.env_ premières lignes.

Sans _.env_ <5.0

Définir les connexions

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'    => '',
        ),
    ),
);
_

Schéma

Pour spécifier la connexion à utiliser, exécutez simplement la méthode connection()

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

Générateur de requêtes

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

Éloquent

Définissez la variable _$connection_ dans votre modèle

_class SomeModel extends Eloquent {

    protected $connection = 'mysql2';

}
_

Vous pouvez également définir la connexion au moment de l'exécution à l'aide de la méthode setConnection ou de la méthode statique on:

_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;
    }

}
_

Note Soyez prudent lorsque vous essayez de créer des relations avec des tables dans des bases de données! C'est possible, mais cela peut être assorti de quelques réserves et dépend de la base de données et/ou des paramètres de base de données que vous avez.


De Laravel Docs

Utilisation de plusieurs connexions de base de données

Lorsque vous utilisez plusieurs connexions, vous pouvez accéder à chacune connection via la méthode de connexion de la façade DB. La name transmise à la méthode connection doit correspondre à l’une des connexions répertoriées dans votre config/database.php fichier de configuration:

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

Vous pouvez également accéder à l'instance PDO sous-jacente brute à l'aide de la méthode getPdo sur une instance de connexion:

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

Liens utiles

  1. Laravel 5 connexion à plusieurs bases de données FROM _laracasts.com_
  2. Connecter plusieurs bases de données dans laravel FROM _tutsnare.com_
  3. Connexions DB multiples dans Laravel FROM _fideloper.com_
353
Abdulla Nilam

Dans Laravel 5.1, vous spécifiez la connexion:

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

Par défaut, Laravel utilise la connexion par défaut. C'est simple, n'est-ce pas?

Lisez plus ici: http://laravel.com/docs/5.1/database#accessing-connections

9
schellingerht

En fait, DB::connection('name')->select(..) ne fonctionne pas pour moi car 'nom' doit être entre guillemets: "nom"

Néanmoins, la requête de sélection est exécutée sur ma connexion par défaut. Nous essayons toujours de comprendre comment convaincre Laravel de fonctionner comme prévu: changez la connexion.

Edit: je l'ai compris. Après le débogage de Laravels DatabaseManager, il s'est avéré que mon database.php (fichier de configuration) (dans $ this-> app) était incorrect. Dans la section "connexions", j'avais des choses comme "base de données" avec les valeurs de celle que j'ai copiée. En termes clairs, au lieu de

env('DB_DATABASE', 'name')

Je devais placer quelque chose comme

'myNewName'

puisque toutes les connexions ont été répertoriées avec les mêmes valeurs pour la base de données, nom d'utilisateur, mot de passe, etc., ce qui n'a bien entendu aucun sens si je souhaite accéder à au moins un autre nom de base de données

Par conséquent, chaque fois que je voulais sélectionner quelque chose dans une autre base de données, je me retrouvais toujours dans ma base de données par défaut.

4
sba

Laravel a un support intégré pour plusieurs systèmes de base de données, vous devez fournir les détails de connexion dans le fichier 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,
        ],
];

Une fois que vous avez cela, vous pouvez créer deux classes de modèle de base pour chaque connexion et définir le nom de la connexion dans ces modèles.

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

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

Vous pouvez étendre ces modèles pour créer plus de modèles pour les tables dans chaque base de données.

0
sumit