Kuinka käyttää Laravel Multiple Database Connection -ominaisuutta verkkosivustolla
Haluatko yhdistää useita tietokantoja Laravel-sovellukseesi? Joskus saatat kohdata tilanteen, jossa sinun on käsiteltävä useampaa kuin yhtä tietokantaa. Tässä artikkelissa tutkitaan kuinka yhdistää ja käyttää useita tietokantoja Laravel-sovelluksessa. Laravel tukee itse ytimessään useita tietokantayhteyksiä.
Yleensä tarvitsemme yhden tietokannan yhdelle verkkosivustolle. Mutta voi olla mahdollista, että joudut tallentamaan tietoja sovelluksestasi toiseen tietokantaan. Työskentelin verkkokaupan projektissa, jossa halusimme lähettää tilaustiedot erilliseen tietokantaan. Sinun tapauksessasi vaatimukset voivat olla erilaiset.
Tämän jälkeen katsotaanpa useiden tietokantojen yhdistäminen ja käyttäminen Laravelin kanssa.
Lisää useita tietokantayhteyksiä Laraveliin
Kuten sanoin, Laravel antaa sinun yhdistää useita tietokantoja. Voimme käyttää erilaista tietokanta-alustaa, kuten SQLite, MySQL, SQLSRV Laravelin kanssa. Tässä opetusohjelmassa aion käyttää toista erillisen tietokannan MySQL-esiintymää. Sanojen järjestyksessä aiomme käsitellä erillistä MySQL-tietokantaa lisätallennustilana.
Laravel tallentaa tietokantayhteyden config/database.php
tiedostoon. Jos haluat lisätä toisen MySQL-yhteyden, meidän on muokattava tätä tiedostoa.
Lisätään toinen yhteys, nimittäin ‘mysql2’. Voit antaa tälle yhteydelle minkä tahansa muun nimen. Varmista vain, että käytät samaa nimeä, kun olet vuorovaikutuksessa tietokannan kanssa.
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'),
]): [],
],
]
Yllä olevassa koodissa yhteys ‘mysql’ on oletusarvo. Lisäsin uuden yhteyden ‘mysql2’ eri vakioilla. Tässä ohitin vakiot nimillä DB_DATABASE_2, DB_USERNAME_2, DB_PASSWORD_2 jne. Jos tietokantaasi isännöidään toisella palvelimella, sinun on vaihdettava myös DB_HOST_2 ja DB_PORT_2 avaimet. Oletan, että molemmat tietokannat ovat samassa palvelimessa. Joten, en muuta näiden vakioiden arvoja.
Laravel saa näiden vakioiden arvot env()
menetelmällä. Se tarkoittaa, että meidän pitäisi lisätä muita tietokantatietoja .env-tiedostoon alla.
DB_HOST_2=127.0.0.1
DB_PORT_2=3306
DB_DATABASE_2=
DB_USERNAME_2=
DB_PASSWORD_2=
Edellä mainittujen vaiheiden suorittamisen jälkeen yhdistämme toisen tietokannan Laraveliin. Seuraavat asiat ovat vuorovaikutuksessa tämän tietokannan kanssa.
Suorita siirto toisessa Laravel-tietokannassa
Kun on kyse Laravelista, meidän on aina luotava taulukoita taulukkoon Migrations-sovelluksen avulla. Oletetaan, että haluamme luoda ‘tuotteet’ -taulukon erilliseen tietokantaan. Suorita alla oleva komento, joka luo siirtotiedoston.
php artisan make:migration create_products_table
Se luo uuden tiedoston ‘tietokanta / siirrot’ -hakemistoon. Avaa tiedosto editoriin ja välitä juuri luotu yhteys alla olevan kuvan mukaisesti.
<?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');
}
}
Olen välittänyt arvon ‘mysql2’ luokan connection
metodille Schema
. Se tarkoittaa, että kun suoritat siirtymiskomennon, tämä koodi suorittaa yllä olevan koodin toisessa tietokannassa, minkä yhteyden merkkijonon olemme välittäneet.
php artisan migrate
Kun olet suorittanut yllä olevan komennon, siirry toiseen tietokantaan. Siinä pitäisi nyt olla "tuotteet" -taulukko.
Suorita kyselyt toisessa tietokannassa
Laravelissa voit olla vuorovaikutuksessa tietokannan kanssa joko Query Builderin kautta tai käyttämällä Eloquent ORM: ää.
DB
julkisivu tarjoaa yhteyden nimisen menetelmän, jota käytetään kyselyjen suorittamiseen toisessa tietokannassa. Kirjoitetaan kysely yhteydelle ‘mysql2’ Query Builderilla.
$products = DB::connection('mysql2')->select('SELECT * FROM products');
$products = DB::connection('mysql2')->select('SELECT * FROM products where id = ?', [1]);
Query Builder suorittaa yllä olevat kyselyt automaattisesti toisessa tietokannassa viittaamalla yhteysmenetelmään.
Kun kyseessä on Eloquent, on kaksi tapaa yhdistää erilliset tietokannat. Ensimmäinen tapa on käyttää $connection
muuttujaa Model-luokassa.
<?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
}
Tuotemalli käsittelee nyt vain toista tietokantaa.
Toisessa vaihtoehdossa voit luoda yhteyden lennossa tarvittaessa. Tällä tavalla voit olla vuorovaikutuksessa useiden tietokantojen kanssa yhdestä mallista.
<?php
...
use AppModelsProduct;
class ProductController extends Controller
{
public function index()
{
$product = new Product;
$product->setConnection('mysql2');
$arr_product = $product->find(1);
dd($arr_product);
}
}
Tässä olen asettanut yhteyden ajonaikaisen setConnection()
menetelmän.
Se siitä! Toivon, että ymmärrät kuinka yhdistää useita tietokantoja Laravel-sovelluksessa. Jaa ajatuksesi ja ehdotuksesi alla olevassa kommenttiosassa.