[Laravel] Cách kết nốt nhiều cơ sở dữ liệu trong Laravel
Trong ứng dụng thực tế, rất nhiều khi chúng ta cần phải sử dụng nhiều kết nối cơ sở dử liệu. Việc sử dụng kết nối nhiều cơ sở dữ liệu trong cùng một dự án nó sẽ giúp chúng ta bớt đi được rất nhiều thời gian và thao tác khi phải tạo lại các bảng và cập nhập dữ liệu cho cơ sở dữ liệu. Vậy làm thế nào để tạo kết nối nhiều cơ sở dữ liệu trong Laravel? Hãy cùng vncoder.vn tìm hiểu nhé.
Chuẩn bị
Chúng ta sẽ sử dụng 3 database khác nhau, trong đó 2 database sử dụng MYSQL và 1 sử dụng SQL Server:
- Database laravelmultidb với connection name là mysql sử dụng MySQL engine.
- Database laravelmultidb2 với connection name là mysql2 sử dụng MySQL engine.
- Database laravelmultidb với connection name là sqlsrv sử dụng SQL Server Engine.
Đây là file config/database.php:
'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
],
'mysql' => [
'driver' => 'mysql',
'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' => '',
'strict' => true,
'engine' => null,
],
'mysql2' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE2', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
'sqlsrv' => [
'driver' => 'sqlsrv',
'host' => env('DB_HOST_SQLSRV', 'localhost'),
'port' => env('DB_PORT_SQLSRV', '1433'),
'database' => env('DB_DATABASE_SQLSRV', 'forge'),
'username' => env('DB_USERNAME_SQLSRV', 'forge'),
'password' => env('DB_PASSWORD_SQLSRV', ''),
'charset' => 'utf8',
'prefix' => '',
],
],
Và file .env:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laramultidb
DB_USERNAME=yourusername
DB_PASSWORD=secret
DB_DATABASE2=laramultidb2
DB_HOST_SQLSRV=127.0.0.1
DB_PORT_SQLSRV=1433
DB_DATABASE_SQLSRV=laravelmultidb
DB_USERNAME_SQLSRV=sa
DB_PASSWORD_SQLSRV=secret
Migration & Model
Khi muốn tạo migration cho cho database nào thì define connection name của database đó trong Schema:
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('types', function (Blueprint $table) {
$table->increments('id');
$table->string('code')->index();
$table->string('name');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->drop('types');
}
File migration trên sẽ migrate table types vào connection mysql2 với DB name là laravmultidb2, nếu không define connection name, Laravel sẽ sử dụng connection mặc định.
Để chỉ định connection trong model, hãy sử dụng attribute $connection:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Type extends Model
{
protected $connection = 'mysql2';
}
Relationship giữa các database
Yêu cầu:
Type (connection: mysql2) has many Post (connection: mysql)
Type (connection: mysql2) has many Mail (connection: sqlsrv)
Chúng ta hoàn toàn có thể làm được việc này thông qua model, chỉ định connection bằng attribute $connection:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Type extends Model
{
protected $connection = 'mysql2';
/**
* one to many relationship with Post (mysql connection)
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function posts()
{
return $this->hasMany(Post::class, 'type_code', 'code');
}
/**
* one to many relationship with Mail (sqlsrv connection)
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function mails()
{
return $this->hasMany(Mail::class, 'type_code', 'code');
}
}
Model Post cũng tương tự:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Mail extends Model
{
protected $connection = 'sqlsrv';
/**
* override date format since SQL server has own date format for timestamp fields
* @var string
*/
protected $dateFormat = 'Y-m-d H:i:s';
/**
* one to many inversion relationship with Type (mysql2 connection)
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function type()
{
return $this->belongsTo(Type::class, 'type_code', 'code');
}
}
Kết luận
Như vậy vncoder.vn đã hướng dẫn xong các bạn cách kết nối nhiều cơ sở dữ liệu trong Laravel, hy vọng bài viết sẽ có ích với bạn. Chúc bạn thành công!.
Xem thêm
-
[Laravel] Hướng dẫn sử dụng thư viện Carbon giúp xử lý datetime dễ dàng hơn trong Laravel
-
[PHP] Hướng dẫn lấy thứ và ngày hiện tại trong tuần sử dụng PHP
Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!
Bài viết liên quan
Bài viết mới
Được xem nhiều nhất
[Laravel] Hướng dẫn tích hợp thanh toán online, tích hợp cổng thanh to...
[Laravel] Sử dụng Ajax làm chức năng tìm kiếm trong Laravel
[Laravel] Cách sử dụng Charts - hướng dẫn vẽ biểu đồ trong Laravel
[Laravel] Hướng dẫn sử dụng Raw DB Query trong Laravel
[Laravel] Hướng dẫn đăng nhập, đăng ký tài khoản bằng tài khoản Facebo...
Khóa học liên quan
Xây dựng ứng dụng với Laravel và Vuejs
Lượt xem: 16288
Chuyên mục: Laravel