Laravel allows user work on multiple database connections. If you need to connect to multiple databases and make them work together, you are beware of the connection setup.
You also allow using different types of database in the same application if you required.
Default connection
In config/database.php
, you can see the configuration item call:
'default' => env('DB_CONNECTION', 'mysql'),
This name references the connections' name mysql
below:
'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,
],
],
If you did not mention the name of database connection in other codes or commands, Laravel will pick up the default database connection name. however, in multiple database connections, even you setup the default connection, you've better setup everywhere which database connection you used.
Migration file
In migration file, if single database connection, you can use:
Schema::create("table",function(Blueprint $table){
$table->increments('id');
});
In multiple database connection, you will use the connection()
method to tell Laravel which database connection you use:
Schema::connection("sqlite")->create("table",function(Blueprint $table){
$table->increments('id');
});
Artisan Migrate
if you use single database connection, you will run:
php artisan migrate
However, for multiple database connection, you've better tell which database connection maintains the migration data. so you will run the following command:
php artisan migrate:install --database=sqlite
This command will install migration table in the target database to prepare migration.
php artisan migrate --database=sqlite
This command will run migration and save the migration data in the target database
php artisan migrate:rollback --database=sqlite
This command will rollback migration and save the migration data in the target database
Eloquent Model
To specify a database connection using Eloquent, you need to define the $connection
property:
namespace App\Model\Sqlite;
class Table extends Model
{
protected $table="table";
protected $connection = 'sqlite';
}
To specify another ( second ) database connection using Eloquent:
namespace App\Model\MySql;
class Table extends Model
{
protected $table="table";
protected $connection = 'mysql';
}
Laravel will use $connection
property defined in a model to utilize the specified connection defined in config/database.php
. If the $connection
property is not defined in a model the default will be used.
You may also specify another connection using the static on
method:
// Using the sqlite connection
Table::on('sqlite')->select(...)->get()
// Using the mysql connection
Table::on('mysql')->select(...)->get()
Database/Query Builder
You may also specify another connection using the query builder:
// Using the sqlite connection
DB::connection('sqlite')->table('table')->select(...)->get()
// Using the mysql connection
DB::connection('mysql')->table('table')->select(...)->get()
Unit Test
Laravel provide seeInDatabase($table,$fielsArray,$connection)
to test database connection code. In Unit test file, you need to do like:
$this
->json(
'GET',
'result1/2015-05-08/2015-08-08/a/123'
)
->seeInDatabase("log", ["field"=>"value"], 'sqlite');
In this way, Laravel will know which database connection to test.
Database Transactions in Unit Test
Laravel allows database to rollback all the change during the tests. For testing multiple database connections, you need to set $connectionsToTransact
properties
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');
}
}