Implementasi Multiple Database Connections di Laravel
Laravel Multiple Database Connections - Laravel adalah salah satu framework PHP yang populer untuk pengembangan aplikasi web. Salah satu fitur yang powerful dalam Laravel adalah kemampuannya untuk bekerja dengan multiple database connection. Multiple database connection memungkinkan aplikasi Laravel untuk berinteraksi dengan lebih dari satu database dalam satu aplikasi. Fitur ini berguna ketika kita perlu mengakses data dari beberapa sumber atau melakukan koneksi ke database yang berbeda, seperti database utama dan database pelaporan yang terpisah. Dalam artikel ini, kita akan membahas tentang implementasi multiple database connection di Laravel dan bagaimana mengoptimalkan penggunaannya.
Table of Contents
Step 1: Install Laravel
Pada langkah yang pertama ini, saya akan memulainya dengan menginstall fresh laravel project akan kita gunakan untuk implementasi atau menggunakan beberapa database dalam satu laravel project (Multiple Database Connections).
//via Laravel Installer
composer global require laravel/installer
laravel new laravel-multiple-database
//via Composer
composer create-project laravel/laravel laravel-multiple-database Untuk installasi laravel bisa menggunakan laravel installer atau menggunakan composer seperti contoh di atas.
Silahkan memilih salah satu cara yang ingin digunakan untuk installasi laravel. Dari kedua contoh perintah installasi laravel di atas, akan sama-sama menghasilkan atau generate laravel project dengan nama laravel-multiple-database.
Tunggu hingga proses installasi selesai dan jika sudah selesai, jangan lupa untuk masuk ke direktori project menggunakan perintah cd laravel-multiple-database.
Step 2: Buat Database
Selanjutnya, buat dua database baru yang akan kita gunakan pada percobaan ini. Disini saya beri contoh, saya membuat dua database baru dengan nama laravel_multiple_database1 dan laravel_multiple_database2. Kemudian kita akan konfigurasi pada file config/app.php dan .env.
Step 3: Configuration
Langkah selanjutnya yaitu melakukan konfigurasi database.
Step 3.1: Database
Di Laravel, kita dapat mengonfigurasi multiple database connection di file konfigurasi config/database.php. Di dalam file ini, kita akan menemukan sebuah array connections yang berisi pengaturan untuk setiap koneksi database. Setiap koneksi database dapat memiliki pengaturan yang berbeda, termasuk driver database, host, nama database, username, dan password database.
Berikut adalah contoh pengaturan multiple database connection di Laravel:
'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('DATABASE2_URL'),
'host' => env('DB_HOST2', '127.0.0.1'),
'port' => env('DB_PORT2', '3306'),
'database' => env('DB_DATABASE2', 'forge'),
'username' => env('DB_USERNAME2', 'forge'),
'password' => env('DB_PASSWORD2', ''),
'unix_socket' => env('DB_SOCKET2', ''),
'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'),
]) : [],
], Pada contoh di atas, terdapat dua koneksi database yang diberi nama 'mysql' dan 'mysql2'. Setiap koneksi memiliki pengaturan yang berbeda, termasuk nama database, username, dan password database. Kita dapat menambahkan lebih banyak koneksi database sesuai kebutuhan.
Step 3.2: Env
Kemudian tambahkan juga di file .env seperti contoh di bawah ini.
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=multiple_database1
DB_USERNAME=root
DB_PASSWORD=
DB_CONNECTION2=mysql
DB_HOST2=127.0.0.1
DB_PORT2=3306
DB_DATABASE2=multiple_database2
DB_USERNAME2=root
DB_PASSWORD2= Step 4: Buat Model & Migration
Selanjutnya, kita perlu membuat model dan migration baru yang nantinya digunakan untuk database multiple_database2. Untuk database multiple_database1, kita akan menggunakan file model dan migration user yang sudah disediakan oleh laravel dari awal.
Jalankan perintah artisan seperti di bawah ini untuk membuat file Article model dan migration.
php artisan make:model Article -mf Kemudian buka file app/Models/Article.php dan tambahkan kode seperti di bawah ini untuk mendifinisakan bahwa model Article ini terkoneksi dengan mysql2 atau dengan database multiple_database2.
protected $connection = 'mysql2'; Sehingga, Article model akan menjadi seperti di bawah ini.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
use HasFactory;
protected $connection = 'mysql2';
protected $guarded = [];
} Jika sudah menjalankan perintah php artisan make:model Article -mf dan file Article model serta migration sudah tergenerate, sekarang silahkan buka file migration yang telah berhasil digenerate tersebut di database/migrations/{timestamp}_create_articles_table.php. Pada method up, kita tambahkan connection ke mysql2. Di method down juga sama, kita tambahkan connection ke mysql2.
Dengan menggunakan method connection() , kita dapat memilih koneksi database yang tepat untuk digunakan dalam operasi tersebut.
public function up(): void
{
Schema::connection('mysql2')->create('articles', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->string('slug')->unique();
$table->longtext('body');
$table->timestamps();
});
}
public function down(): void
{
Schema::connection('mysql2')->dropIfExists('articles');
} Jalankan perintah artisan seperti di bawah ini untuk memigrasi file migration ke database connection mysql & mysql2 atau di database multiple_database1 dan multiple_database2.
php artisan migrate Step 5: Generate Data Dummy
Ok, sekarang kita akan buat data dummy untuk mengisi table users di database multiple_database1 (mysql connection) dan table articles di database multiple_database2 (mysql2 connection).
Yang pertama, kita akan buat data dummy untuk table users. Karena laravel telah menyediakan User factory, jadi kita gunakan itu yang sudah ada. Kita akan menjalankan factory dari tinker. Caranya, jalankan perintah php artisan tinker, kemudian jalankan lagi perintah User::factory()->count(10)->create().
Dengan begitu, kita telah mempunyai data dummy untuk table users di database multiple_database1
php artisan tinker
User::factory()->count(10)->create() Yang kedua, kita akan membuat data dummy untuk table articles di database multiple_database2. Sekarang buka file database/factories/ArticleFactory.php. Pada file tersebut atau tepatnya pada method definition, ubah menjadi seperti di bawah ini.
public function definition(): array
{
$title = $this->faker->sentence(6);
$slug = \Str::slug($title);
return [
'title' => $title,
'slug' => $slug,
'body' => $this->faker->paragraph(10),
];
} Selanjutnya kita eksekusi file ArticleFactory.php dari tinker dengan menjalankan dua perintah seperti di bawah ini secara berurutan.
php artisan tinker
Article::factory()->count(10)->create() Jika muncul error
Class "Article" not found, jalankan perintahcomposer dump-autoload
Oke, sampai disini kita telah berhasil membuat data dummy di database yang berbeda yaitu multiple_database1 (mysql connection) dan multiple_database2 (mysql2 connection).
Selanjutnya kita akan tampilkan data-data dari table users dan articles yang tentunya juga berasal dari dua database yang berbeda (multiple database).
Step 6: Setup Route
Kita beralih ke file routes/web.php. Di file ini, kita akan mengubah route menjadi seperti kode di bawah ini. Di root route ini, kita akan menampilkan data dari table users di database multiple_database1 dan data dari table articles di database multiple_database2 dengan connection mysql2.
Route::get('/', function () {
$users = \App\Models\User::get();
$articles = \App\Models\Article::get();
return view('welcome', compact('users','articles'));
}); Step 7: Setup View
Kemudian, buka file welcome.blade.php dan ubah kode yang ada menjadi seperti kode di bawah ini. Dari kode seperti di bawah ini, kita memakai starter template dari bootstrap 5 dan menambahkan dua table dalam navs & tabs untuk menampilkan data-data dari table users dan articles seperti yang telah kita setup di file routes/web.php pada langkah sebelumnya.
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-9ndCyUaIbzAi2FUVXJi0CjmCapSmO7SnpJef0486qhLnuZ2cdeRhO02iuK6FUUVM" crossorigin="anonymous">
<title>Laravel Multiple Database Connections</title>
</head>
<body>
<div class="container my-5">
<h1 class="fs-5 fw-bold my-3 text-center">Laravel Multiple Database Connections</h1>
<ul class="nav nav-tabs" id="myTab" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="db1-tab" data-bs-toggle="tab" data-bs-target="#db1-tab-pane" type="button" role="tab" aria-controls="db1-tab-pane" aria-selected="true">
Database 1: multiple_database1
</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="db2-tab" data-bs-toggle="tab" data-bs-target="#db2-tab-pane" type="button" role="tab" aria-controls="db2-tab-pane" aria-selected="false">
Database 2: multiple_database2
</button>
</li>
</ul>
<div class="tab-content" id="myTabContent">
<div class="tab-pane fade show active" id="db1-tab-pane" role="tabpanel" aria-labelledby="db1-tab" tabindex="0">
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Name</th>
<th scope="col">Email</th>
</tr>
</thead>
<tbody>
@foreach ($users as $key => $item)
<tr>
<th scope="row">{{ ++$key }}</th>
<td>{{ $item->name }}</td>
<td>{{ $item->email }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<div class="tab-pane fade" id="db2-tab-pane" role="tabpanel" aria-labelledby="db2-tab" tabindex="0">
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Title</th>
<th scope="col">Body</th>
</tr>
</thead>
<tbody>
@foreach ($articles as $key => $item)
<tr>
<th scope="row">{{ ++$key }}</th>
<td>{{ $item->title }}</td>
<td>{{ Str::limit($item->body, 50) }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-geWF76RCwLtnZ8qwWowPQNguL3RmwHVBC9FhGdlKrxdiJJigb/j/68SIy3Te4Bkz" crossorigin="anonymous"></script>
</body>
</html> Step 8: Testing
Kita telah melalui langkah-langkah yang dimulai dari install laravel, membuat dua database, melakukan konfigurasi, sampai dengan setup route dan mengubah file welcome.blade.php untuk menampilkan data-data dari table users dan articles. Sekarang kita telah sampai di langkah terakhir yaitu testing. Untuk melihat hasilnya, apakah data dari dua database tersebut sudah berhasil di tampilan dalam satu laravel project, silahkan jalankan project dengan menjalankan perintah php artisan serve, lalu buka laravel project di browser. Maka akan menampilkan data-data dari table users dan articles. Itu artinya, sampai di langkah ini, kita telah berhasil mengimplementasikan atau menggunakan dua database dalam satu laravel project (laravel multiple database connections).

Bonus
Ehh, belum selesai ya. ada bonus untuk kalian nih 👏 Dengan menggunakan multiple database di laravel, juga memungkinkan untuk menerapkan relasi antar model meskipun beda database.
Menambahkan Relationship
Bagaimana jika kita menambahkan relationship ? seperti menambahkan one to many relationship di laravel multiple database connections.
Oke, mari kita coba implementasikan dengan menambahkan field baru di table articles (di database multiple_database2) yaitu field user_id yang akan kita hubungkan dengan table users di database multiple_database1.
Kita buat file migration baru dengan perintah artisan seperti di bawah ini.
php artisan make:migration add_user_id_to_articles_table Kemudian buka file database/migrations/{timestamp}_add_user_id_to_articles_table.php yang baru saja digenerate. Pada method up dan down, ubah kodenya menjadi seperti di bawah ini dengan menambahkan field user_id dengan nilai default 1 dan dengan connection ke mysql2 atau ke database multiple_database2.
public function up(): void
{
Schema::connection('mysql2')->table('articles', function (Blueprint $table) {
$table->foreignId('user_id')->default(1)->after('id');
});
}
public function down(): void
{
Schema::connection('mysql2')->table('articles', function (Blueprint $table) {
$table->dropColumn('user_id');
});
} Selanjutnya, buka file app/Models/Article.php dan tambahkan kode seperti di bawah ini.
public function user()
{
return $this->setConnection('mysql')->belongsTo(User::class);
} Perhatikan kode di atas, dengan kode tersebut kita membuat relationship atau menghubungkan Article ke User dengan setconnection mysql. setConnection('mysql'), artinya kita menghubungkan table articles dari database multiple_database2 ke table users dengan database connection ke mysql atau ke database multiple_database1.
Kita update sedikit untuk file welcome.blade.php. Pada kode untuk menampilkan data articles dalam bentuk table, tambahkan <th scope="col">User</th> dan <td>{{$item->user->name}}</td>.
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Title</th>
<th scope="col">Body</th>
<th scope="col">User</th>
</tr>
</thead>
<tbody>
@foreach ($articles as $key => $item)
<tr>
<th scope="row">{{ ++$key }}</th>
<td>{{ $item->title }}</td>
<td>{{ Str::limit($item->body, 50) }}</td>
<td>{{ $item->user->name }}</td>
</tr>
@endforeach
</tbody>
</table> Dan sekarang jika kita cek lagi, pada view table articles sudah berhasil menampilkan nama user berdasarkan user_id (yang telah kita set default(1)).

Itulah pengenalan tentang Laravel multiple database connection. Fitur ini memungkinkan Kita untuk menghubungkan aplikasi Laravel dengan lebih dari satu database, memungkinkan fleksibilitas dan skenario penggunaan yang beragam.
Official Documentation: #Using Multiple Database Connections
Credit: Online illustrations by Storyset
Published on April 05, 2022Last updated on June 03, 2026