Cách sử dụng nhiều kết nối cơ sở dữ liệu trong Laravel

Trong Laravel 10, bạn có thể xác định và sử dụng nhiều kết nối cơ sở dữ liệu trong ứng dụng của mình. Tính năng này hữu ích khi bạn cần kết nối với nhiều cơ sở dữ liệu hoặc nguồn dữ liệu trong cùng một ứng dụng.

Để xác định nhiều kết nối cơ sở dữ liệu, bạn có thể thêm các kết nối mới vào tệp config/database.php. Mỗi kết nối phải có một tên duy nhất và các tùy chọn cấu hình, chẳng hạn như trình điều khiển cơ sở dữ liệu, máy chủ lưu trữ, tên người dùng và mật khẩu.

Khi bạn đã xác định các kết nối cơ sở dữ liệu, bạn có thể sử dụng chúng trong toàn bộ ứng dụng của mình bằng cách chỉ định tên kết nối trong các truy vấn cơ sở dữ liệu của bạn. Bạn có thể chuyển đổi linh hoạt giữa các kết nối cơ sở dữ liệu, cho phép bạn tương tác liền mạch với nhiều cơ sở dữ liệu hoặc nguồn dữ liệu trong cùng một ứng dụng.

Nhìn chung, việc sử dụng nhiều kết nối cơ sở dữ liệu trong Laravel 10 cung cấp một cách mạnh mẽ và linh hoạt để quản lý nhiều nguồn dữ liệu trong ứng dụng của bạn.

Đặt biến ENV:

Tại đây, bạn cần đặt biến cấu hình trên tệp .env. hãy tạo như dưới đây:

.env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=mydatabase
DB_USERNAME=root
DB_PASSWORD=root
   
DB_CONNECTION_SECOND=mysql
DB_HOST_SECOND=127.0.0.1
DB_PORT_SECOND=3306
DB_DATABASE_SECOND=mydatabase2
DB_USERNAME_SECOND=root
DB_PASSWORD_SECOND=root

Cấu hình cơ sở dữ liệu:

Bây giờ, khi chúng ta tạo biến trong tệp env, chúng ta cần sử dụng biến đó trên tệp cấu hình, vì vậy hãy mở tệp database.php và thêm khóa kết nối mới như dưới đây:

config/database.php

<?php
  
use Illuminate\Support\Str;
  
return [
   
    'default' => env('DB_CONNECTION', 'mysql'),
   
    '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'),
            ]) : [],
        ],
        'mysql_second' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL_SECOND'),
            'host' => env('DB_HOST_SECOND', '127.0.0.1'),
            'port' => env('DB_PORT_SECOND', '3306'),
            'database' => env('DB_DATABASE_SECOND', 'forge'),
            'username' => env('DB_USERNAME_SECOND', 'forge'),
            'password' => env('DB_PASSWORD_SECOND', ''),
            'unix_socket' => env('DB_SOCKET_SECOND', ''),
            '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'),
            ]) : [],
        ],
.....        

Lấy dữ liệu từ nhiều cơ sở dữ liệu bằng DB:

Tôi sẽ viết hai lộ trình nhận sản phẩm từ các kết nối cơ sở dữ liệu khác nhau. bạn có thể xem ví dụ đơn giản với DB.

Hãy thêm hai tuyến đường vào tệp của bạn:

tuyến/web.php

<?php
  
use Illuminate\Support\Facades\Route;
  
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
  
/*------------------------------------------
--------------------------------------------
Getting Records of Mysql Database Connections
--------------------------------------------
--------------------------------------------*/
Route::get('/get-mysql-blogs', function () {
    $products = DB::table("blogs")->get();
      
    dd($products);
});
  
/*------------------------------------------
--------------------------------------------
Getting Records of Mysql Second Database Connections
--------------------------------------------
--------------------------------------------*/
Route::get('/get-mysql-second-blogs', function () {
    $products = DB::connection('mysql_second')->table("blogs")->get();
      
    dd($products);
});

Nhiều kết nối cơ sở dữ liệu với di chuyển:

Bạn có thể tạo các lần di chuyển riêng biệt cho nhiều kết nối cơ sở dữ liệu:

Mặc định:

<?php
.....
public function up(): void
{
    Schema::create('blogs', function (Blueprint $table) {
        $table->increments('id');
        $table->string('title');
        $table->string('body')->nullable();
        $table->timestamps();
    });
}
.....

Cơ sở dữ liệu thứ hai:

<?php
.....
public function up(): void
{
    Schema::connection('mysql_second')->create('blogs', function (Blueprint $table) {
        $table->increments('id');
        $table->string('title');
        $table->string('body')->nullable();
        $table->timestamps();
    });
}
.....

Nhiều kết nối cơ sở dữ liệu với Model:

Mặc định:

<?php
  
namespace App\Models;
  
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
  
class Blog extends Model
{
    use HasFactory;
   
    protected $fillable = [
        'id', 'title', 'body'
    ];
}

Cơ sở dữ liệu thứ hai:

<?php
  
namespace App\Models;
  
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
  
class Blog extends Model
{
    use HasFactory;
  
    protected $connection = 'mysql_second';
  
    protected $fillable = [
        'id', 'title', 'body'
    ];
}

Nhiều kết nối cơ sở dữ liệu trong bộ điều khiển:

Mặc định:

<?php

namespace App\Http\Controllers;

use App\Models\Blog;
    
class BlogController extends Controller
{
    /**
     * Write code on Method
     *
     * @return response()
     */
    public function getRecord()
    {
        $blogs = Blog::get();
        return $blogs;
    }
}

Cơ sở dữ liệu thứ hai:

<?php

namespace App\Http\Controllers;

use App\Models\Blog;
    
class BlogController extends Controller
{
    
    /**
     * Write code on Method
     *
     * @return response()
     */
    public function getRecord()
    {
        $blog = new Blog;
        $blog->setConnection('mysql_second');
        $something = $blog->find(1);
        return $something;
    }
}

Mã hoá vui vẻ !

1.05 GEEK