I want to combine multiple databases in my system. Most of the time the database is MySQL; but it may be different in the future, i.e. administrators can generate reports like this, which is the source of using heterogeneous database systems.
So my question is Does Laravel provide any Facade to handle this situation? Or does any other framework have features that better suit the problem?
P粉9576615442023-10-14 00:28:20
In Laravel 5.1, you specify the connection:
$users = DB::connection('foo')->select(...);
By default, Laravel uses the default connection. Pretty simple, isn't it?
Read more here: http://laravel.com/docs/5.1/database#Visit the connection
P粉3402642832023-10-14 00:26:49
From the Laravel Documentation: You can access each connection when using multiple connections, through the DB
connection method on the appearance. The name passed to the connection method should correspond to one of the connections listed in the config/database.php
configuration file:
$users = DB::connection('foo')->select(...);
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=mysql_database DB_USERNAME=root DB_PASSWORD=secret DB_CONNECTION_PGSQL=pgsql DB_HOST_PGSQL=127.0.0.1 DB_PORT_PGSQL=5432 DB_DATABASE_PGSQL=pgsql_database DB_USERNAME_PGSQL=root DB_PASSWORD_PGSQL=secret
Useconfig/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'), ], 'pgsql' => [ 'driver' => env('DB_CONNECTION_PGSQL'), 'host' => env('DB_HOST_PGSQL'), 'port' => env('DB_PORT_PGSQL'), 'database' => env('DB_DATABASE_PGSQL'), 'username' => env('DB_USERNAME_PGSQL'), 'password' => env('DB_PASSWORD_PGSQL'), ],
No .env
<= 4.0 (or lower)<= 4.0(或更低)
app/config/database.php
return array( 'default' => 'mysql', 'connections' => array( # Primary/Default database connection 'mysql' => array( 'driver' => 'mysql', 'host' => '127.0.0.1', 'database' => 'mysql_database', 'username' => 'root', 'password' => 'secret' 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ), # Secondary database connection 'pgsql' => [ 'driver' => 'pgsql', 'host' => 'localhost', 'port' => '5432', 'database' => 'pgsql_database', 'username' => 'root', 'password' => 'secret', 'charset' => 'utf8', 'prefix' => '', 'schema' => 'public', ] ), );
Run the connection()
method to specify the connection to use.
Schema::connection('pgsql')->create('some_table', function($table) { $table->increments('id'): });
Alternatively, define a connection at the top.
protected $connection = 'pgsql';
$users = DB::connection('pgsql')->select(...);
(In Laravel >= 5.0 (or higher))
Set $connection
Variables
class ModelName extends Model { // extend changed protected $connection = 'pgsql'; }
(In Laravel <= 4.0 (or lower)) <= 4.0(或更低)中)
Set $connection
Variables
class SomeModel extends Eloquent { protected $connection = 'pgsql'; }
DB::transaction(function () { DB::connection('mysql')->table('users')->update(['name' => 'John']); DB::connection('pgsql')->table('orders')->update(['status' => 'shipped']); });
or
DB::connection('mysql')->beginTransaction(); try { DB::connection('mysql')->table('users')->update(['name' => 'John']); DB::connection('pgsql')->beginTransaction(); DB::connection('pgsql')->table('orders')->update(['status' => 'shipped']); DB::connection('pgsql')->commit(); DB::connection('mysql')->commit(); } catch (\Exception $e) { DB::connection('mysql')->rollBack(); DB::connection('pgsql')->rollBack(); throw $e; }
You can also define the connection at runtime via the setConnection
method or the on
static method:
class SomeController extends BaseController { public function someMethod() { $someModel = new SomeModel; $someModel->setConnection('pgsql'); // non-static method $something = $someModel->find(1); $something = SomeModel::on('pgsql')->find(1); // static method return $something; } }
Test version (Updated)
Version | Tested (Y/N) |
---|---|
4.2 | no |
5 | is (5.5) |
6 | no |
7 | no |
8 | is (8.4) |
9 | is (9.2) |