cara menggunakan multiple database di laravel 8

Cara Menggunakan Multiple Database di Laravel 8

Pada beberapa kasus atau kondisi, kita mungkin perlu menggunakan beberapa database dalam satu project laravel. Oleh karena itu, pada artikel kali ini saya akan berbagi tentang bagaimana cara menggunakan beberapa database dalam satu project laravel atau biasa disebut dengan multiple database connection. Untuk percobaan kali ini, kita akan mengimplementasikan pada laravel versi 8.

Oke. Langkah-langkah yang akan kita lakukan pada percobaan kali ini, antara lain;

  • install laravel
  • membuat dua buah database
  • konfigurasi database
  • membuat data dummy
  • setup view untuk menampilkan data dari dua buah database yang kita buat
  • dan lain-lain.

Install Laravel

Pada langkah pertama ini, kita perlu menginstall laravel 8 yang mana kita akan mencoba mengimplementasikan atau menggunakan beberapa database dalam satu project laravel (Multiple Database Connections).

Untuk melakukan instalasi laravel, Anda dapat menggunakan installer laravel atau menggunakan composer seperti contoh berikut.

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

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

Silahkan pilih salah satu metode yang ingin Anda gunakan untuk instalasi laravel. Dari kedua contoh perintah instalasi laravel di atas, keduanya akan menghasilkan atau menggenerate sebuah project laravel dengan nama laravel-multiple-database.

Tunggu hingga proses instalasi selesai dan jika sudah selesai, jangan lupa untuk masuk ke direktori project dengan menggunakan perintah cd laravel-multiple-database.

Membuat Database

Selanjutnya, buatlah dua database baru untuk menyimpan data sampel yang akan kita gunakan dalam percobaan ini.

Jika Anda menggunakan xampp sebagai pengembangan lokal, silakan buat database baru di localhost/phpmyadmin.

Disini saya berikan contoh, saya membuat dua database baru dengan nama laravel_multiple_database1 dan laravel_multiple_database2. Kemudian kita akan mengkonfigurasi di file config/app.php dan .env.

Konfigurasi Laravel

Kemudian kita perlu menambahkan konfigurasi database pada file config/database.php dan .env.

Pertama kita buka terlebih dahulu file config/database.php dan tambahkan konfigurasi mysql seperti berikut.

'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'),
            ]) : [],
],

Secara default, Laravel sudah menyediakan beberapa koneksi database seperti sqlite, mysql, pgsql dan sqlsrv. Karena pada artikel kali ini kita akan mencoba membuat beberapa koneksi database di laravel dengan menggunakan mysql, maka kita perlu menambahkan koneksi mysql seperti kode di atas. Sebagai contoh, disini saya menambahkan koneksi database dengan nama mysql2.

Kemudian tambahkan juga konfigurasi di bawah ini pada file .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=

Membuat Model & Migration

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

Jalankan perintah artisan seperti di bawah ini untuk membuat model Post dan file migrasi.

php artisan make:model Post -m

Kemudian buka file app/Models/Post.php dan tambahkan kode seperti di bawah ini untuk mendefinisikan bahwa model Post terhubung ke mysql2 atau ke database laravel_multiple_database2.

protected $connection = 'mysql2';

Jika Anda telah menjalankan perintah php artisan make:model Post -m dan model Post dan file migrasi telah dihasilkan, sekarang silakan buka file migrasi yang dihasilkan di database/migrations/xxxx_xx_xx_xxxxxx_create_posts_table.php. Pada method up(), kita menambahkan title dan string koneksi ke mysql2. Begitu juga dengan method down(), kita menambahkan koneksi ke mysql2.

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');
}

Jalankan perintah artisan seperti di bawah untuk memindahkan file migrasi ke koneksi database mysql2 atau di database laravel_multiple_database2.

php artisan migrate

Membuat Data Dummy

Sekarang kita akan membuat data dummy untuk mengisi tabel users di database laravel_multiple_database1 (koneksi mysql) dan tabel posts di database laravel_multiple_database2 (koneksi mysql2).

Pertama, kita akan membuat data dummy untuk tabel users. Karena laravel telah menyediakan factory User, jadi kita gunakan yang sudah ada. Kita akan menjalankan factory dari Tinker. Untuk melakukannya, jalankan perintah php artisan tinker, lalu jalankan perintah User::factory()->count(10)->create().

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

Dengan begitu, kita memiliki data dummy untuk tabel users di database laravel_multiple_database1.

Kedua, kita akan membuat data dummy untuk tabel posts di database laravel_multiple_database2. Tetapi pertama-tama, kita perlu membuat file factory baru untuk posts.

Jalankan perintah artisan seperti di bawah ini untuk menghasilkan file PostFactory.

php artisan make:factory PostFactory --model=Post

Kemudian jika Anda telah membuat PostFactory, sekarang buka file tersebut di database/factories/PostFactory.php. Pada file tersebut atau lebih tepatnya pada method definition(), ubahlah menjadi seperti di bawah. Disini kita hanya perlu membuat data dummy dengan faker->text pada field title.

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

Selanjutnya, kita eksekusi file PostFactory.php dari tinker dengan menjalankan kedua perintah di bawah ini secara berurutan.

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

Sejauh ini kita sudah berhasil membuat data dummy pada database yang berbeda, yaitu laravel_multiple_database1 (koneksi mysql) dan laravel_multiple_database2 (koneksi mysql2).

Selanjutnya kita akan menampilkan data dari tabel users dan posts yang tentunya juga berasal dari dua database yang berbeda (multiple database).

Setup Route

Kita beralih ke file routes/web.php. Pada file ini, kita akan mengubah route menjadi seperti kode di bawah ini.

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

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

Di dalam root route ini, kita akan menampilkan data dari tabel users yang ada di database laravel_multiple_database1 dan data dari tabel posts yang ada di database laravel_multiple_database2 dengan koneksi mysql2.

Setup View

Kemudian, buka file welcome.blade.php dan ubah kode yang ada menjadi seperti kode di bawah ini.

<!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-F3w7mX95PdgyTmZZMECAngseQB83DfGTowi0iMjiWaeVhAn4FJkqJByhZMI3AhiU" crossorigin="anonymous">

    <title>Laravel Multiple Database Connections - Leravio</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/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-/bQdsTh/da6pkI1MST/rWKFNjaCP5gBSY4sEBT38Q/9RBh9AH40zEOg7Hlq2THRZ" crossorigin="anonymous"></script>

  </body>
</html>

Dari kode di atas, kita menggunakan template awal dari bootstrap 5 dan menambahkan sebuah tabel untuk menampilkan data dari tabel users dan posts seperti yang sudah kita atur di file routes/web.php pada langkah sebelumnya.

Menambahkan Relasi

Bagaimana jika kita menambahkan sebuah relasi? Seperti menambahkan relasi one to many pada koneksi multiple database di laravel.

Mari kita coba implementasikan dengan menambahkan field baru di tabel posts (di database laravel_multiple_database2), yaitu field user_id yang akan kita kaitkan dengan tabel users di database laravel_multiple_database1.

Kita buat terlebih dahulu file migrasi baru dengan perintah artisan seperti berikut.

php artisan make:migration add_user_id_to_posts_table

Kemudian buka file database/migrations/xxxx_xx_xxxxxx_add_user_id_to_posts_table.php yang baru saja Anda buat.

Pada method up() and down(), ubah kode menjadi seperti di bawah ini dengan menambahkan field user_id dengan nilai default 1 dan koneksi ke mysql2 atau ke database laravel_multiple_database2.

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');
    });
}

Selanjutnya, buka file app/Models/Post.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 relasi atau menghubungkan Post ke User dengan mysql setconnection. setConnection(‘mysql’), berarti kita menghubungkan tabel post dari database laravel_multiple_database2 ke tabel user dengan koneksi database ke mysql atau ke database laravel_multiple_database1.

Kemudian, kita perbarui sedikit untuk file welcome.blade.php. Pada kode untuk menampilkan data posting dalam bentuk tabel, tambahkan User dan {{$item->user->nama}}.

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

Penutup

Kita telah melalui langkah-langkah mulai dari menginstal laravel, membuat dua database, melakukan konfigurasi, hingga mengatur rute dan mengubah file welcome.blade.php untuk menampilkan data dari tabel users dan posts.

Sekarang kita telah sampai pada langkah terakhir yaitu pengujian. Untuk melihat hasilnya, apakah data dari dua database sudah berhasil ditampilkan dalam satu project laravel, silahkan jalankan project dengan menjalankan perintah php artisan serve, kemudian buka project laravel di browser.

Maka akan ditampilkan data dari tabel users dan posts. Itu artinya, sampai pada langkah ini, kita sudah berhasil mengimplementasikan atau menggunakan dua database dalam satu project laravel (laravel multiple database connections).

Leave a Comment

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

Scroll to Top