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?
.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 utiliserenv('DB_USERNAME')
qui est mis en métrique dans _.env
_ premières lignes.
.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.
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
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
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.
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.