August 2, 2024 laravel

Koneksi Database Dinamis di Laravel

Dalam satu aplikasi laravel bisa saja terdapat lebih dari satu koneksi database, yang tiap-tiap database-nya digunakan pada kondisi tertentu.

Misalnya setiap user memiliki koneksi database yang berbeda, user satu menggunakan database di server A, user yang lainnya menggunakan database di server B.

Untuk secara dinamis menggunakan koneksi database di laravel, anda bisa menggunakan method statis setDefaultConnection pada class DB.

DB::setDefaultConnection('nama-koneksi-db');

Implementasinya bisa di middleware, contoh middleware DynamicDbFromUser berikut.

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;

class DynamicDbFromUser
{
    public function handle(Request $request, Closure $next): Response
    {
        if (Auth::check()) {
            $user = $request->user();

            DB::setDefaultConnection($user->db_key);
        }

        return $next($request);
    }
}

Lalu tinggal digunakan di routes sebagai middleware.

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Middleware\DynamicDbFromUser;
use App\Http\Controllers\Api\V1\AuthController;

Route::get('/v1/me', [AuthController::class, 'me'])
    ->middleware('auth:sanctum', DynamicDbFromUser::class);

Dengan begitu db koneksi yang digunakan pada setiap query database akan dinamis berdasarkan nilai kolom db_key pada user.

Pastikan juga nilai db_key yang ditulis pada user harus tersedia di config/database.php key connections.

<?php

return [
    'connections' => [
        'mysql_default' => [
            'driver' => 'mysql',
            'url' => env('DB_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'laravel'),
            'username' => env('DB_USERNAME', 'root'),
            'password' => env('DB_PASSWORD', '')
            // dll
        ],
        'mysql_1' => [
            'driver' => 'mysql',
            'url' => env('DB_1_URL'),
            'host' => env('DB_1_HOST', '127.0.0.1'),
            'port' => env('DB_1_PORT', '3306'),
            'database' => env('DB_1_DATABASE', 'laravel'),
            'username' => env('DB_1_USERNAME', 'root'),
            'password' => env('DB_1_PASSWORD', '')
            // dll
        ],
        'mysql_2' => [
            'driver' => 'mysql',
            'url' => env('DB_2_URL'),
            'host' => env('DB_2_HOST', '127.0.0.1'),
            'port' => env('DB_2_PORT', '3306'),
            'database' => env('DB_2_DATABASE', 'laravel'),
            'username' => env('DB_2_USERNAME', 'root'),
            'password' => env('DB_2_PASSWORD', '')
            // dll
        ],
    ]
];