Come utilizzare la funzionalità di connessioni multiple di database di Laravel su un sito Web
Stai cercando di connettere più database alla tua applicazione Laravel? A volte, potresti imbatterti in una situazione in cui devi gestire più di un database. In questo articolo, studiamo come connettere e utilizzare più database nell’applicazione Laravel. Laravel fornisce supporto per più connessioni al database nel suo stesso nucleo.
Di solito, abbiamo bisogno di un singolo database per un sito web. Tuttavia, può essere possibile che tu debba memorizzare alcuni dati sulla tua applicazione su un altro database. Ho lavorato a un progetto di e-commerce in cui volevamo inviare i dettagli dell’ordine a un database separato. Nel tuo caso, i requisiti possono essere diversi.
Detto questo, diamo un’occhiata alla connessione e all’utilizzo di più database con Laravel.
Aggiungi più connessioni al database in Laravel
Come ho detto, Laravel ti consente di connettere più database. Possiamo utilizzare una piattaforma di database diversa come SQLite, MySQL, SQLSRV con Laravel. Per questo tutorial, utilizzerò un’altra istanza MySQL di un database separato. In parole povere, ci occuperemo di un database MySQL separato come spazio di archiviazione aggiuntivo.
Laravel memorizza una connessione al database nel config/database.php
file. Per aggiungere un’altra connessione di MySQL dobbiamo modificare questo file.
Aggiungiamo un’altra connessione e cioè ‘mysql2’. Puoi dare qualsiasi altro nome a questa connessione. Assicurati di utilizzare lo stesso nome mentre interagisci con il database.
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'),
]): [],
],
]
Nel codice sopra, la connessione ‘mysql’ è quella predefinita. Ho aggiunto una nuova connessione "mysql2" con diverse costanti. Qui, ho passato le costanti come DB_DATABASE_2, DB_USERNAME_2, DB_PASSWORD_2, ecc. Se il tuo database è ospitato su un altro server, dovresti cambiare anche le chiavi di DB_HOST_2 e DB_PORT_2. Presumo che entrambi i database siano sullo stesso server. Quindi, non cambio i valori di queste costanti.
Laravel ottiene i valori di queste costanti usando il env()
metodo. Significa che dovremmo aggiungere altri dettagli del database in un file ‘.env’ come di seguito.
DB_HOST_2=127.0.0.1
DB_PORT_2=3306
DB_DATABASE_2=
DB_USERNAME_2=
DB_PASSWORD_2=
Dopo aver eseguito i passaggi precedenti, abbiamo finito di connettere un altro database in Laravel. La prossima cosa è interagire con questo database.
Esegui la migrazione su un altro database in Laravel
Quando si tratta di Laravel, dovremmo sempre creare tabelle nel database utilizzando le migrazioni. Supponiamo di voler creare una tabella "prodotti" nel nostro database separato. Esegui il comando seguente che creerà un file di migrazione.
php artisan make:migration create_products_table
Creerà un nuovo file all’interno della directory ‘database/migrations’. Apri il file nell’editor e passa la connessione appena creata come mostrato di seguito.
<?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');
}
}
Ho passato il valore ‘mysql2’ al connection
metodo della Schema
classe. Significa che quando esegui il comando migrate, questo codice esegue il codice sopra sull’altro database la cui stringa di connessione è stata passata.
php artisan migrate
Dopo aver eseguito il comando sopra, vai al tuo secondo database. Ora dovrebbe avere una tabella "prodotti".
Esegui query su un altro database
In Laravel, puoi interagire con il database tramite un Query Builder o utilizzando Eloquent ORM.
DB
facciata fornisce un metodo chiamato connection che viene utilizzato per eseguire query su un altro database. Scriviamo una query sulla connessione ‘mysql2’ usando un Query Builder.
$products = DB::connection('mysql2')->select('SELECT * FROM products');
$products = DB::connection('mysql2')->select('SELECT * FROM products where id = ?', [1]);
Query Builder eseguirà automaticamente le query di cui sopra sull’altro database facendo riferimento al metodo di connessione.
Quando si tratta di Eloquent, ci sono 2 modi per connettere database separati. Il primo modo è usare la $connection
variabile all’interno della classe Model.
<?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
}
Ora il modello "Prodotti" si occuperà solo del secondo database.
Nella seconda opzione, puoi creare una connessione al volo ogni volta che è necessario. In questo modo è possibile interagire con più database da un unico Modello.
<?php
...
use AppModelsProduct;
class ProductController extends Controller
{
public function index()
{
$product = new Product;
$product->setConnection('mysql2');
$arr_product = $product->find(1);
dd($arr_product);
}
}
Qui, ho impostato il runtime della connessione utilizzando il setConnection()
metodo.
Questo è tutto! Spero che tu capisca come connettere più database nell’applicazione Laravel. Per favore condividi i tuoi pensieri e suggerimenti nella sezione commenti qui sotto.
articoli Correlati
- Crea un sito Web multilingue in PHP utilizzando Laravel Framework
- Una guida per caricare e comprimere immagini in Laravel
- Come installare e utilizzare CKEditor in Laravel