Sök…
Flera databasanslutningar
Laravel tillåter användare att arbeta med flera databasanslutningar. Om du behöver ansluta till flera databaser och få dem att fungera tillsammans är du uppmärksam på anslutningsinställningen.
Du tillåter också att använda olika typer av databaser i samma applikation om det behövs.
Standardanslutning I config/database.php
kan du se konfigurationsobjektets samtal:
'default' => env('DB_CONNECTION', 'mysql'),
Detta namn hänvisar till anslutningarnas namn mysql
nedan:
'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,
],
],
Om du inte nämnde namnet på databasanslutningen i andra koder eller kommandon hämtar Laravel standarddatabasanslutningsnamnet. Men i flera databasanslutningar, även om du ställer in standardanslutningen, har du bättre inställt överallt vilken databasanslutning du använde.
Migrationsfil
I migreringsfilen, om en enda databasanslutning, kan du använda:
Schema::create("table",function(Blueprint $table){
$table->increments('id');
});
I flera databasanslutningar använder du connection()
för att berätta för Laravel vilken databasanslutning du använder:
Schema::connection("sqlite")->create("table",function(Blueprint $table){
$table->increments('id');
});
Hantverkare migrera
om du använder en enda databasanslutning kör du:
php artisan migrate
Men för flera databasanslutningar ska du bättre berätta vilken databasanslutning som behåller migrationsdata. så du kör följande kommando:
php artisan migrate:install --database=sqlite
Detta kommando installerar migreringstabellen i måldatabasen för att förbereda migrering.
php artisan migrate --database=sqlite
Detta kommando kör migrering och sparar migrationsdata i måldatabasen
php artisan migrate:rollback --database=sqlite
Detta kommando rullar tillbaka migreringen och sparar migrationsdata i måldatabasen
Vältalig modell
För att ange en databasanslutning med Eloquent måste du definiera egenskapen $connection
:
namespace App\Model\Sqlite;
class Table extends Model
{
protected $table="table";
protected $connection = 'sqlite';
}
Så här anger du en annan (andra) databasanslutning med Eloquent:
namespace App\Model\MySql;
class Table extends Model
{
protected $table="table";
protected $connection = 'mysql';
}
Laravel använder egenskapen $connection
definierad i en modell för att använda den angivna anslutningen definierad i config/database.php
. Om egenskapen $connection
inte definieras i en modell kommer standard att användas.
Du kan också ange en annan anslutning med metoden statisk on
:
// Using the sqlite connection
Table::on('sqlite')->select(...)->get()
// Using the mysql connection
Table::on('mysql')->select(...)->get()
Databas / frågeställare
Du kan också ange en annan anslutning med frågeformuläret:
// Using the sqlite connection
DB::connection('sqlite')->table('table')->select(...)->get()
// Using the mysql connection
DB::connection('mysql')->table('table')->select(...)->get()
Enhetstest
Laravel ger seeInDatabase($table,$fielsArray,$connection)
att testa databasanslutningskod. I enhetens testfil måste du göra som:
$this
->json(
'GET',
'result1/2015-05-08/2015-08-08/a/123'
)
->seeInDatabase("log", ["field"=>"value"], 'sqlite');
På detta sätt vet Laravel vilken databasanslutning som ska testas.
Databastransaktioner i enhetstest
Laravel tillåter databas att återföra alla ändringar under testen. För att testa flera databasanslutningar måste du ställa in $connectionsToTransact
egenskaper
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');
}
}