Recherche…


Connexions de bases de données multiples

Laravel permet aux utilisateurs de travailler sur plusieurs connexions de bases de données. Si vous devez vous connecter à plusieurs bases de données et les faire fonctionner ensemble, vous devez faire attention à la configuration de la connexion.

Vous pouvez également utiliser différents types de bases de données dans la même application si vous en avez besoin.

Connexion par défaut Dans config/database.php , vous pouvez voir l'appel de l'élément de configuration:

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

Ce nom fait référence au nom des connexions mysql ci-dessous:

'connections' => [

    'sqlite' => [
        'driver' => 'sqlite',
        'database' =>  database_path('database.sqlite'),
        'prefix' => '',
    ],

    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', 'localhost'),
        '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,
    ],
],

Si vous n'avez pas mentionné le nom de la connexion à la base de données dans d'autres codes ou commandes, Laravel choisira le nom de connexion de base de données par défaut. cependant, dans les connexions à plusieurs bases de données, même si vous configurez la connexion par défaut, vous avez une meilleure configuration partout où vous avez utilisé la connexion à la base de données.

Fichier de migration

Dans le fichier de migration, si une connexion à une base de données unique, vous pouvez utiliser:

 Schema::create("table",function(Blueprint $table){
     $table->increments('id');
});

En connexion à plusieurs bases de données, vous utiliserez la méthode connection() pour indiquer à Laravel quelle connexion de base de données vous utilisez:

 Schema::connection("sqlite")->create("table",function(Blueprint $table){
     $table->increments('id');
});

Artisan Migrate

Si vous utilisez une connexion à une seule base de données, vous exécuterez:

php artisan migrate

Toutefois, pour une connexion à plusieurs bases de données, il est préférable de savoir quelle connexion de base de données conserve les données de migration. vous exécuterez donc la commande suivante:

php artisan migrate:install --database=sqlite

Cette commande installe la table de migration dans la base de données cible pour préparer la migration.

php artisan migrate --database=sqlite

Cette commande exécute la migration et enregistre les données de migration dans la base de données cible

php artisan migrate:rollback --database=sqlite

Cette commande annulera la migration et enregistrera les données de migration dans la base de données cible.

Modèle éloquent

Pour spécifier une connexion à une base de données à l'aide d'Eloquent, vous devez définir la propriété $connection :

namespace App\Model\Sqlite;
class Table extends Model
{
    protected $table="table";
    protected $connection = 'sqlite';
}

Pour spécifier une autre connexion (seconde) à la base de données en utilisant Eloquent:

namespace App\Model\MySql;
class Table extends Model
{
    protected $table="table";
    protected $connection = 'mysql';
}

Laravel utilisera la propriété $connection définie dans un modèle pour utiliser la connexion spécifiée définie dans config/database.php . Si la propriété $connection n'est pas définie dans un modèle, la valeur par défaut sera utilisée.

Vous pouvez également spécifier une autre connexion en utilisant la méthode statique on :

// Using the sqlite connection
Table::on('sqlite')->select(...)->get()
// Using the mysql connection
Table::on('mysql')->select(...)->get()

Base de données / Générateur de requêtes

Vous pouvez également spécifier une autre connexion en utilisant le générateur de requêtes:

// Using the sqlite connection
DB::connection('sqlite')->table('table')->select(...)->get()
// Using the mysql connection
DB::connection('mysql')->table('table')->select(...)->get()  

Test de l'unité

Laravel fournit seeInDatabase($table,$fielsArray,$connection) pour tester le code de connexion à la base de données. Dans le fichier de test unitaire, vous devez faire comme:

$this
    ->json(
        'GET',
        'result1/2015-05-08/2015-08-08/a/123'
    )
     ->seeInDatabase("log", ["field"=>"value"], 'sqlite');

De cette façon, Laravel saura quelle connexion de base de données tester.

Transactions de base de données dans le test unitaire

Laravel autorise la base de données à annuler toutes les modifications pendant les tests. Pour tester plusieurs connexions de base de données, vous devez définir $connectionsToTransact propriétés $connectionsToTransact

use Illuminate\Foundation\Testing\DatabaseMigrations;

class ExampleTest extends TestCase
{
     use DatabaseTransactions;

     $connectionsToTransact =["mysql","sqlite"] //tell Laravel which database need to rollBack

    public function testExampleIndex()
    {
        $this->visit('/action/parameter')
         ->see('items');
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow