[Học Laravel] Cách kết nốt nhiều cơ sở dữ liệu trong Laravel

[Học 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 WebFree.Net 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:

  1. Database laravelmultidb với connection name là mysql sử dụng MySQL engine.
  2. Database laravelmultidb2 với connection name là mysql2 sử dụng MySQL engine.
  3. 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:

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:

hasMany(Post::class, 'type_code', 'code');
    }

    /**
     * one to many relationship with Mail (sqlsrv connection)
     * @return IlluminateDatabaseEloquentRelationsHasMany
     */
    public function mails()
    {
        return $this->hasMany(Mail::class, 'type_code', 'code');
    }
}

Model Post cũng tương tự:

belongsTo(Type::class, 'type_code', 'code');
    }
}

Kết luận

Như vậy WebFree.Net đã 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

admin

Leave a Reply

Your email address will not be published. Required fields are marked *