Kamis, 16 September 2021

Menggabungkan 2 Database Dalam satu view dan controller di laravel 8

 Konsep microservices yang lagi booming akhir-akhir ini membuat paradigma baru dalam dunia desain sistem informasi. Konsep aplikasi monolite yaitu membangangun satu aplikasi yang besar dan terintegrasi dari awal hingga akhir yaitu proses akuntansi rupanya mulai mengalami penurunan dalam penggunaannya. Berikut kekurangan dalam arsitektur monolite

a. Sulit memahami kode pemrograman saat maintenance.

b. Perubahan aplikasi sangat riskan, karena bila terjadi error aplikasi akan berhenti semuanya.

c. Penambahan teknologi terbaru akan lebih rumit karena seluruh aplikasi harus di rewrite

d. Sulit mengidentifikasi bagian mana yang membuat aplikasi berat.

Dan masih banyak lagi kelemahan dalam aplikasi monolite. 

Akan tetapi konsep microservices zaman ini yang dalam menghubungkan antar aplikasi menggunakan API maupun Message Broker tentunya akan membuat lebih panjang waktu dalam development aplikasi. Tentunya hal ini membuat seorang fullstack developer kewalahan apabila konsep API maupun Message Broker di lakukan.

Dalam mengatasi masalah-malah ini menurut saya laravel lah jawabannya. Karena dalam laravel bisa menggabungkan 2 Database dengan lokasi berbeda sekalipun. Pada laravel sebelumnya, yaitu laravel 7 menggabungkan Database harus dalam lokasi yang sama. Akan tetapi pada laravel 8 hal tersebut bisa di lakukan.

Pada kasus kali ini saya akan mencoba untuk menjelaskan cara membuat sebuah view yang dimana database user dan database post terpisah.

Untuk setting nya mari kita membuat settingan pada file config->database.php

  'mysql_USER' => [

            'driver' => env('DB_CONNECTION_USER'),

            'host' => env('DB_HOST_USER', '127.0.0.1'),

            'port' => env('DB_PORT_USER', '3306'),

            'database' => env('DB_DATABASE_USER', 'forge'),

            'username' => env('DB_USERNAME_USER', 'forge'),

            'password' => env('DB_PASSWORD_USER', ''),

            'unix_socket' => '',

            'charset' => 'utf8mb4',

            'collation' => 'utf8mb4_unicode_ci',

            'prefix' => '',

            'prefix_indexes' => true,

            'strict' => true,

            'engine' => null,

            'options'   => [

                \PDO::ATTR_EMULATE_PREPARES => true

            ]

        ],


 'mysql_POST' => [

            'driver' => env('DB_CONNECTION_POST'),

            'host' => env('DB_HOST_POST', '127.0.0.1'),

            'port' => env('DB_PORT_POST', '3306'),

            'database' => env('DB_DATABASE_POST', 'forge'),

            'username' => env('DB_USERNAME_POST', 'forge'),

            'password' => env('DB_PASSWORD_POST', ''),

            'unix_socket' => '',

            'charset' => 'utf8mb4',

            'collation' => 'utf8mb4_unicode_ci',

            'prefix' => '',

            'prefix_indexes' => true,

            'strict' => true,

            'engine' => null,

            'options'   => [

                \PDO::ATTR_EMULATE_PREPARES => true

            ]

        ],

Dalam settingan di atas kita mendefinisikan database user dan database post.

Kemudian kita setting pada env file kita menambahkan seperti ini

DB_CONNECTION_USER=mysql

DB_HOST_USER=192.168.2.12

DB_PORT_USER=3306

DB_DATABASE_USER=db_user

DB_USERNAME_USER=user_app

DB_PASSWORD_USER=xxxxxxx


DB_CONNECTION_POST=mysql

DB_HOST_POST=192.168.2.14

DB_PORT_POST=3306

DB_DATABASE_POST=db_post

DB_USERNAME_POST=post_user

DB_PASSWORD_POST=xxxx

Terlihat ke dua settingan tersebut berada pada lokasi berbeda dan ini bisa dilakukan.

Sekarang tambahkan settinga connection pada model user code " protected $connection = 'mysql_USER'; " seperti dibawah ini

class User extends Authenticatable

{

    use HasFactory, Notifiable, HasRoles;

    protected $connection = 'mysql_USER';


    /**

     * The attributes that are mass assignable.

     *

     * @var array

     */

    protected $fillable = [

        'name',

        'image',

        'email',

        'password',

        'lokasi_id',

        'efaktur_area_id',

    ];

}

Begitu juga pada model post kita setting koneksinya "protected $connection = 'mysql_POST';"

use App\Models\User;

class Post extends Model

{

    protected $guarded = [];

     protected $connection = 'mysql_POST';

    public function user()

    {

        return $this->belongsTo(User::class);

    }


Sehingga dalam controller kita bisa menampilkan data misal seperti ini

$p = Post::find(1);

dd($p->user->name);

Jika berhasi maka var dump dari nama user dalam tabel post tersebut.

Yes ternyata tabel POST bisa berelasi dengan Tabel User walaupun berbeda lokasi database. Dengan seperti ini kita bisa membuat aplikasi kecil-kecil tetapi user mendaftarkan satu akun dan tersimpan pada database user.

Kelebihan konsep ini adalah aplikasi dengan terpisah-pisah bisa kita masukkan ke dalam Docker Container sehinggal kita bisa memantau trafficnya. Dan bila ada salah satu aplikasi bikin lemot maka aplikasi yang lain tidak tergangu.