Hur man använder Laravel Multiple Database Connections-funktionen på en webbplats
Vill du ansluta flera databaser till din Laravel-applikation? Ibland kan du stöta på en situation där du behöver hantera mer än en databas. I den här artikeln studerar vi hur man ansluter och använder flera databaser i Laravel-applikationen. Laravel tillhandahåller stöd för flera databasanslutningar i själva kärnan.
Vanligtvis behöver vi en enda databas för en webbplats. Men det kan vara möjligt att du måste lagra data om din applikation i en annan databas. Jag arbetade med ett e-handelsprojekt där vi ville skicka orderinformation till en separat databas. I ditt fall kan kraven vara olika.
Med detta sagt, låt oss ta en titt på att ansluta och använda flera databaser med Laravel.
Lägg till flera databasanslutningar i Laravel
Som jag sa tillåter Laravel dig att ansluta flera databaser. Vi kan använda en annan databasplattform som SQLite, MySQL, SQLSRV med Laravel. För den här guiden ska jag använda en annan MySQL-instans av en separat databas. För ord kommer vi att hantera en separat MySQL-databas som extra lagring.
Laravel lagrar en databasanslutning i config/database.php
filen. För att lägga till ytterligare en anslutning av MySQL måste vi ändra den här filen.
Låt oss lägga till en annan anslutning, nämligen ‘mysql2’. Du kan ge vilket annat namn som helst till denna anslutning. Se bara till att du kommer att använda samma namn när du interagerar med databasen.
config / database.php
<?php
use IlluminateSupportStr;
return [
...
'connections' => [
...
...
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'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', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql')? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]): [],
],
'mysql2' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST_2', '127.0.0.1'),
'port' => env('DB_PORT_2', '3306'),
'database' => env('DB_DATABASE_2', 'forge'),
'username' => env('DB_USERNAME_2', 'forge'),
'password' => env('DB_PASSWORD_2', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql')? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]): [],
],
]
I ovanstående kod är anslutningen ‘mysql’ standard. Jag lade till en ny anslutning ‘mysql2’ med olika konstanter. Här passerade jag konstanterna som DB_DATABASE_2, DB_USERNAME_2, DB_PASSWORD_2, etc. Om din databas är värd på en annan server bör du också ändra nycklarna till DB_HOST_2 och DB_PORT_2. Jag antar att båda databaserna finns på samma server. Så jag ändrar inte värdena på dessa konstanter.
Laravel får värdena för dessa konstanter med env()
metoden. Det betyder att vi bör lägga till andra databasuppgifter i en ‘.env’ -fil enligt nedan.
DB_HOST_2=127.0.0.1
DB_PORT_2=3306
DB_DATABASE_2=
DB_USERNAME_2=
DB_PASSWORD_2=
Efter att ha utfört ovanstående steg är vi klara med att ansluta en annan databas i Laravel. Nästa grej interagerar med denna databas.
Kör migrering på en annan databas i Laravel
När det gäller Laravel ska vi alltid skapa tabeller i databasen med hjälp av Migrations. Låt oss säga att vi vill skapa en "produkttabell" i vår separata databas. Kör kommandot nedan som skapar en migreringsfil.
php artisan make:migration create_products_table
Det skapar en ny fil i katalogen ‘databas / migrering’. Öppna filen i redigeraren och skicka den nyskapade anslutningen enligt nedan.
<?php
use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;
class CreateProductsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('products', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('products');
}
}
Jag har skickat värdet ‘mysql2’ till klassens connection
metod Schema
. Det betyder att när du kör migrera-kommandot, kör den här koden ovanstående kod i den andra databasen vilken anslutningssträng vi har skickat.
php artisan migrate
Efter att ha kört ovanstående kommando, gå över till din andra databas. Den borde nu ha en "produkt" -tabell.
Kör frågor på en annan databas
I Laravel kan du interagera med databasen antingen via en Query Builder eller med Eloquent ORM.
DB
fasad ger en metod som kallas anslutning som används för att köra frågor i en annan databas. Låt oss skriva en fråga om anslutningen ‘mysql2’ med hjälp av en Query Builder.
$products = DB::connection('mysql2')->select('SELECT * FROM products');
$products = DB::connection('mysql2')->select('SELECT * FROM products where id = ?', [1]);
Query Builder kör automatiskt ovanstående frågor i den andra databasen genom att hänvisa till anslutningsmetoden.
När det gäller Eloquent finns det två sätt att ansluta separata databaser. Det första sättet är att använda $connection
variabeln i din modellklass.
<?php
namespace AppModels;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
class Product extends Model
{
use HasFactory;
/**
* The connection name for the model.
*
* @var string
*/
protected $connection = 'mysql2'; //pass the connection name here
}
Nu kommer ‘Produkter’ -modellen endast att hantera den andra databasen.
I det andra alternativet kan du skapa en anslutning i farten när det behövs. På detta sätt kan du interagera med flera databaser från en enda modell.
<?php
...
use AppModelsProduct;
class ProductController extends Controller
{
public function index()
{
$product = new Product;
$product->setConnection('mysql2');
$arr_product = $product->find(1);
dd($arr_product);
}
}
Här har jag ställt in anslutningens körtid med setConnection()
metoden.
Det är allt! Jag hoppas att du förstår hur man ansluter flera databaser i Laravel-applikationen. Dela dina tankar och förslag i kommentarsektionen nedan.
relaterade artiklar
- Skapa flerspråkig webbplats i PHP med hjälp av Laravel Framework
- En guide för att ladda upp och komprimera bilder i Laravel
- Hur man installerar och använder CKEditor i Laravel