Selama ini kita selalu menggunakan satu database untuk mengambil data dari aplikasi Laravel yang kita buat. Bagaimana kalau suatu saat aplikasi yang kita buat membutuhkan data dari tabel yang berasal dari database yang berbeda? Di tips kali ini saya akan share caranya, tidak terlalu sulit kok. Yuk kita mulai.
Sebelumnya, buatlah dua buah database mysql. Contoh disini, saya akan mengambil data dari dua buah tabel dari dua database. Yang satu mengambil data di dalam tabel articles dari database laravue, dan yang satu lagi mengambil data di dalam tabel contacts dari database laravel_ref.
Buat table contacts di dalam database laravel_ref dan isi dengan beberapa records.
Buat tabel articles di dalam database laravue, dan isi dengan beberapa records.
Selanjutnya, buka aplikasi laravel yang sudah dibuat sebelumnya, dan tambahkan informasi database di dalam file .env
1 2 3 4 5 6 7 8 9 10 11 12 13 |
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel_ref DB_USERNAME=root DB_PASSWORD=root DB_CONNECTION_SECOND=mysql DB_HOST_SECOND=127.0.0.1 DB_PORT_SECOND=3306 DB_DATABASE_SECOND=laravue DB_USERNAME_SECOND=root DB_PASSWORD_SECOND=root |
Database utama kita adalah laravel_ref, dan database tambahan adalah laravue.
Selanjutnya, di dalam file config/database.php tambahkan informasi database ke 2 di dalam array ‘connections’.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
'mysql2' => [ 'driver' => env('DB_CONNECTION_SECOND'), 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST_SECOND', '127.0.0.1'), 'port' => env('DB_PORT_SECOND', '3306'), 'database' => env('DB_DATABASE_SECOND', 'forge'), 'username' => env('DB_USERNAME_SECOND', 'forge'), 'password' => env('DB_PASSWORD_SECOND', ''), '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'), ]) : [], ], |
Kita akan buat dua buat model, Contact model dan Article model:
1 |
php artisan make:model Contact |
1 |
php artisan make:model Article |
Tambahkan informasi table di model Contact yang ada di folder app :
1 2 3 4 5 6 7 8 9 10 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Contact extends Model { protected $table = 'contacts'; } |
Selanjutnya untuk model Article, karena kita mengambil dari database yang berbeda, selain tambahkan informasi table, tambahkan juga informasi connectionnya :
1 2 3 4 5 6 7 8 9 10 11 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Article extends Model { protected $connection = 'mysql2'; protected $table = 'articles'; } |
Nama connection disesuaikan dengan yang tadi kita tambahkan di config/database.php
Selanjutnya tambahkan route di web.php untuk menampilkan data, kemudian buat file multipledb.blade.php di dalam folder views :
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php use Illuminate\Support\Facades\Route; use App\Contact; use App\Article; Route::get('/multiple-db', function () { $contacts = Contact::all(); $articles = Article::all(); return view('multipledb', compact('contacts', 'articles')); }); |
views/multipledb.blade.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
<!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Laravel</title> <!-- Fonts --> <link href="https://fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet"> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous"> </head> <body> <div class="flex-center position-ref full-height"> <div class="content"> <h2>Contacts (From 1st Database)</h2> <table class="table mb-5"> <thead> <tr> <th scope="col">Name</th> <th scope="col">Phone</th> </tr> </thead> <tbody> @foreach($contacts as $contact) <tr> <td>{{ $contact->name }}</td> <td>{{ $contact->phone }}</td> </tr> @endforeach </tbody> </table> <h2>Articles (From 2nd Database)</h2> <table class="table mb-5"> <thead> <tr> <th scope="col">Title</th> <th scope="col">Body</th> </tr> </thead> <tbody> @foreach($articles as $article) <tr> <td>{{ $article->title }}</td> <td>{{ $article->body }}</td> </tr> @endforeach </tbody> </table> </div> </div> </body> </html> |
Hasilnya :
Cara kedua untuk menampilkan data dari multiple database juga bisa menggunakan raw query :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\DB; use App\Contact; use App\Article; Route::get('/multiple-db', function () { // $contacts = Contact::limit(3)->get(); // $articles = Article::limit(3)->get(); $contacts = DB::select(DB::raw("SELECT * FROM contacts LIMIT 3")); $articles = DB::connection('mysql2')->select(DB::raw("SELECT * FROM articles LIMIT 3")); return view('multipledb', compact('contacts', 'articles')); }); |
Hasilnya pun sama saja :
Semoga bermanfaat ya!