Menggunakan Beberapa Database di Laravel 8 (Multiple Database Connections)

Menggunakan Beberapa Database di Laravel 8 (Multiple Database Connections)

Admin
Admin・ 28 September 2021
13 min read ・ 8920 views

Laravel Multiple Database Connections - Dalam beberapa kasus atau kondisi, mungkin saja kita perlu menggunakan beberapa database dalam satu laravel project. Nah, di artikel ini saya akan share tentang cara menggunakan beberapa database dalam satu laravel project atau biasa disebut dengan multiple database connections. Untuk percobaan ini nanti, kita akan implementasikan di laravel versi terbaru (saat ini versi 8).

Oke. Langkah-langkah yang akan kita lakukan dipercobaan ini, antara lain; install laravel, buat dua database, database configuration, membuat data dummy, setup view untuk menampilkan data dari dua database yang kita buat, dan lain-lain.

Step 1: Install Laravel

//via Laravel Installer
composer global require laravel/installer
laravel new laravel-multiple-database

//via Composer
composer create-project laravel/laravel laravel-multiple-database

Pada langkah yang pertama ini, kita perlu menginstall laravel versi terbaru (saat ini versi 8) yang akan kita coba untuk implementasi atau menggunakan beberapa database dalam satu laravel project (Multiple Database Connections). 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 untuk menyimpan data-data sample yang akan kita gunakan pada percobaan ini. Jika kamu menggunakan xampp sebagai local development, silahkan buat database baru di localhost/phpmyadmin. 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

Kemudian kita perlu menambahkan database configuration di file config/database.php dan .env.

Step 3.1: config/database.php

 '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('DATABASE_URL'),
            'host' => env('DB_HOST_2', '127.0.0.1'),
            'port' => env('DB_PORT_2', '3306'),
            'database' => env('DB_DATABASE_2', 'forge'),
            'username' => env('DB_USERNAME_2', 'forge'),
            'password' => env('DB_PASSWORD_2', ''),
            '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'),
            ]) : [],
        ],

By default, laravel sudah menyediakan beberapa database connections seperti sqlite, mysql, pgsql dan sqlsrv. Karena di artikel ini kita akan mencoba membuat multiple database connection di laravel dengan sama-sama menggunakan mysql, jadi kita perlu menambahkan mysql connection seperti kode di atas. Sebagai contoh, disini saya menambahkan database connection dengan nama mysql2.

Step 3.2: Setup .ENV

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_multiple_database1
DB_USERNAME=root
DB_PASSWORD=

DB_CONNECTION_2=mysql
DB_HOST_2=127.0.0.1
DB_PORT_2=3306
DB_DATABASE_2=laravel_multiple_database2
DB_USERNAME_2=root
DB_PASSWORD_2=

Kemudian tambahkan juga di file .env seperti contoh di atas.

Step 4: Buat Model & Migration

Selanjutnya, kita perlu membuat model dan migration baru yang nantinya digunakan untuk database laravel_multiple_database2. Untuk database laravel_multiple_database1, kita akan menggunakan file model dan migration user yang sudah disediakan oleh laravel dari awal.

php artisan make:model Post -m

Jalankan perintah artisan seperti di atas untuk membuat file Post model dan migration.

protected $connection = 'mysql2';

Kemudian buka file app/Models/Post.php dan tambahkan kode seperti di atas untuk mendifinisakan bahwa model Post ini terkoneksi dengan mysql2 atau dengan database laravel_multiple_database2.

public function up()
 {
    Schema::connection('mysql2')->create('posts', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->timestamps();
    });
}

public function down()
{
    Schema::connection('mysql2')->dropIfExists('posts');
}

Jika sudah menjalankan perintah php artisan make:model Post -m dan file Post model serta migration sudah tergenerate, sekarang silahkan buka file migration yang telah berhasil digenerate tersebut di database/migrations/xxxx_xx_xx_xxxxxx_create_posts_table.php. Pada method up, kita tambahkan string title dan connection ke mysql2. Di method down juga sama, kita tambahkan connection ke mysql2.

php artisan migrate

Jalankan perintah artisan seperti di atas untuk memigrasi file migration ke database connection mysql2 atau di database laravel_multiple_database2.

Step 5: Buat Data Dummy

Ok, sekarang kita akan buat data dummy untuk mengisi table users di database laravel_multiple_database1 (mysql connection) dan table posts di database laravel_multiple_database2 (mysql2 connection).

php artisan tinker
User::factory()->count(10)->create()

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 laravel_multiple_database1.

php artisan make:factory PostFactory --model=Post

Yang kedua, kita akan membuat data dummy untuk table posts di database laravel_multiple_database2. Tapi sebelumnya, kita perlu generate file factory baru untuk posts. Jalankan perintah artisan seperti di atas untuk generate file PostFactory.

public function definition()
{
    return [
        'title' => $this->faker->text()
    ];
}

Kemudian jika sudah generate PostFactory, sekarang buka file tersebut di database/factories/PostFactory.php. Pada file tersebut atau tepatnya pada method definition, ubah menjadi seperti di atas. Disini kita hanya perlu membuat data dummy dengan faker->text di field title.

php artisan tinker
Post::factory()->count(10)->create()

Selanjutnya kita eksekusi file PostFactory.php dari tinker dengan menjalankan dua perintah seperti di atas secara berurutan. 

Oke, sampai disini kita telah berhasil membuat data dummy di database yang berbeda yaitu laravel_multiple_database1 (mysql connection) dan laravel_multiple_database2 (mysql2 connection).

Selanjutnya kita akan tampilkan data-data dari table users dan posts yang tentunya juga berasal dari dua database yang berbeda (multiple database).

Step 6: Setup Route

Route::get('/', function () {
    $users = \App\Models\User::get();
    $posts = \App\Models\Post::get();

    return view('welcome', compact('users','posts'));
});

Kita beralih ke file routes/web.php. Di file ini, kita akan mengubah route menjadi seperti kode di atas. Di root route ini, kita akan menampilkan data dari table users di database laravel_multiple_database1 dan data dari table posts di database laravel_multiple_database2 dengan connection mysql2.

Step 7: Setup View

<!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/bootstrap@5.1.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-F3w7mX95PdgyTmZZMECAngseQB83DfGTowi0iMjiWaeVhAn4FJkqJByhZMI3AhiU" 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>
        <div class="row">
            <h2 class="fs-5 fw-bold my-3">Database 1: laravel_multiple_database1</h2>
            <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="row">
            <h2 class="fs-5 fw-bold my-3">Database 2: laravel_multiple_database2</h2>
            <table class="table">
                <thead>
                    <tr>
                        <th scope="col">#</th>
                        <th scope="col">Title</th>
                    </tr>
                </thead>
                <tbody>
                    @foreach ($posts as $key => $item)
                        <tr>
                            <th scope="row">{{ ++$key }}</th>
                            <td>{{ $item->title }}</td>
                        </tr>
                    @endforeach
                </tbody>
            </table>
        </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-/bQdsTh/da6pkI1MST/rWKFNjaCP5gBSY4sEBT38Q/9RBh9AH40zEOg7Hlq2THRZ" crossorigin="anonymous"></script>

  </body>
</html>

Kemudian, buka file welcome.blade.php dan ubah kode yang ada menjadi seperti kode di atas. Dari kode seperti di atas, kita memakai starter template dari bootstrap 5 dan menambahkan table untuk menampilkan data-data dari table users dan posts seperti yang telah kita setup di file routes/web.php pada langkah sebelumnya.

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 posts. 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 posts. Itu artinya, sampai di langkah ini, kita telah berhasil mengimplementasikan atau menggunakan dua database dalam satu laravel project (laravel multiple database connections).

Tambahan: 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 posts (di database laravel_multiple_database2) yaitu field user_id yang akan kita hubungkan dengan table users di database laravel_multiple_database1.

php artisan make:migration add_user_id_to_posts_table

Kita buat file migration baru dengan perintah artisan seperti di atas.

public function up()
{
    Schema::connection('mysql2')->table('posts', function (Blueprint $table) {
       $table->foreignId('user_id')->default(1);
    });
}
....
....
....
public function down()
{
    Schema::table('posts', function (Blueprint $table) {
        $table->dropColumn('user_id');
    });
}

Kemudian buka file database/migrations/xxxx_xx_xx_xxxxxx_add_user_id_to_posts_table.php yang baru saja digenerate. Pada method up dan down, ubah kodenya menjadi seperti di atas dengan menambahkan field user_id dengan nilai default 1 dan dengan connection ke mysql2 atau ke database laravel_multiple_database2.

public function user()
{
    return $this->setConnection('mysql')->belongsTo(User::class);
}

Selanjutnya, buka file app/Models/Post.php dan tambahkan kode seperti di atas. Perhatikan kode di atas, dengan kode tersebut kita membuat relationship atau menghubungkan Post ke User dengan setconnection mysql. setConnection('mysql'), artinya kita menghubungkan table posts dari database laravel_multiple_database2 ke table users dengan database connection ke mysql atau ke database laravel_multiple_database1.

<div class="row">
    <h2 class="fs-5 fw-bold my-3">Database 2: laravel_multiple_database2</h2>
    <table class="table">
        <thead>
            <tr>
                <th scope="col">#</th>
                <th scope="col">Title</th>
                <th scope="col">User</th>
            </tr>
        </thead>
        <tbody>
            @foreach ($posts as $key => $item)
            <tr>
                <th scope="row">{{ ++$key }}</th>
                <td>{{ Str::limit($item->title, 100) }}</td>
                <td>{{ $item->user->name }}</td>
            </tr>
            @endforeach
        </tbody>
    </table>
</div>

Kita update sedikit untuk file welcome.blade.php. Pada kode untuk menampilkan data posts dalam bentuk table, tambahkan <th scope="col">User</th> dan <td>{{$item->user->name}}</td>.

laravel multiple database connections with relationship

Dan sekarang jika kita cek lagi, pada view table posts sudah berhasil menampilkan nama user berdasarkan user_id (yang telah kita set default(1)).

 

Cukup sekian artikel kali, jika kalian punya cara lain dari apa yang telah disampaikan pada artikel ini, kalian bisa share di form komentar di bawah ini. Semoga artikel ini bisa bermanfaat dan sampai jumpa di artikel berikutnya. 👋 🚀 👨‍🚀

Tinggalkan Komentar
Loading Comments