Hallo teman-teman ONPHPID, di artikel Many To Many Eloquent Relationships Pada Laravel 5.3 Untuk Pemula sebelumnya, kita sudah belajar tentang suatu hubungan relasi Many To Many. Jika belum mengikuti artikel sebelumnya bisa membacanya terlebih dulu, agar dapat mngikuti tutorial pada artikel ini. Pada tutorial kali ini, ONPHPID akan menjelaskan salah satu hubungan yang mungkin teman-teman belum mendengarnya. ONPHPID pun baru tahu di Framework Laravel, yaitu Has Many Through Relationships.
Apa itu Has Many Through Relationships ?
Pada dokumentasi Laravel 5.3 disebutkan bahwa Has Many Through merupakan relasi yang dapat dijadikan jalan pintas atau shortcut untuk mengakses data dari tabel lain, namun dilakukan dengan pendekatan dari tabel lain atau tabel yang dapat menghubungkan data tersebut. Sebagai contoh, ONPHPID akan memberi gambaran sebagai berikut :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
kotas id - integer nama_kota - string users id - integer kota_id - integer name - string kendaraans id - integer user_id - integer nama_kendaraan - string |
dari plan tabel di atas, tabel kendaraans tidak ada hubungan relasi dengan tabel kotas (baca:kota) tapi kita dapat mendapatkan semua data kendaraan yang ada di kota A misalnya. Lalu bagaimana caranya? yaitu dengan memanfaatkan tabel users yang berelasi dengan tabel kendaraans. Mari kita coba agar tidak berangan-angan. O iya, jika teman-teman sudah mengikuti tutorial ini dari awal, pastinya sudah memiliki tabel tersebut kecuali tabel kotas. Karena tabel tersebut baru akan kita buat pada tutorial kali ini.
Buka dulu projectnya masing-masing, lalu buat satu buah Model dengan nama Kota sekaligus file migrations-nya dengan perintah di bawah ini :
1 |
php artisan make:model Kota -m |
jika sudah buat agar model Kota menjadi seperti di bawah ini :
Kota.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 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Kota extends Model { protected $table = 'kotas'; protected $fillable = ['nama_kota']; /** * Untuk mendapatkan semua kendaraan melalui model Kota. * Jika table kalian mengikuti konvensi dari Laravel * Maka pakai yang di bawah ini * Konvensi tsb yaitu nama Foreign key nya user_id, post_id, dll * dan Primary key nya id */ public function kendaraans() { return $this->hasManyThrough(Kendaraan::class, User::class); } /** * Jika tidak mengikuti konvensi Laravel */ public function kendaraan() { return $this->hasManyThrough( 'App\Kendaraan', 'App\User', 'kode_kota', // foreign key di table users misalnya 'user_kode', // foreign key di table kendaraans misalnya 'kode_user' // foreign key di table users misalnya ); } } |
kemudian tambahkan pada method up() di file migrations yang baru kita buat jadi seperti di bawah ini :
1 2 3 4 5 6 7 8 9 10 |
// code lain public function up() { Schema::create('kotas', function (Blueprint $table) { $table->increments('id'); $table->string('nama_kota'); $table->timestamps(); }); } // code lain |
setelah itu kita buat satu file migrations untuk menambah kolom foreign pada tabel users, karena tabel kotas dan users belum berelasi, dengan perintah artisan berikut :
1 |
php artisan make:migration create_foreign_in_users_table |
kemudian buat method up() menjadi seperti di bawah ini :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// code lain public function up() { Schema::table('users', function(Blueprint $table){ $table->integer('kota_id') ->index() ->unsigned() ->after('password'); $table->foreign('kota_id') ->references('id') ->on('kotas') ->onUpdate('cascade') ->onDelete('cascade'); }); } // code lain |
setelah itu kita buat satu buah file seeder dengan nama KotaSeeder.php
dengan menggunakan perintah artisan di bawah ini :
1 |
php artisan make:seeder KotaSeeder |
buat menjadi seperti di bawah ini :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// code lain public function run() { \App\Kota::insert([ [ 'nama_kota' => 'magetan' ], [ 'nama_kota' => 'surakarta' ], [ 'nama_kota' => 'yogyakarta' ] ]); } // code lain |
karena kita pernah melakukan seeder pada tutorial sebelumnya, maka kita perlu mengubah data users. Jadi buka file UserTableSeeder.php
dan ubah menjadi seperti di bawah ini :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// code lain public function run() { \App\User::insert([ [ 'name' => 'onphpid', 'email' => 'onphpid@gmail.com', 'password' => \Hash::make('onphpid'), 'kota_id' => 1 ], [ 'name' => 'john', 'email' => 'john@gmail.com', 'password' => \Hash::make('john'), 'kota_id' => 2 ] ]); } // code lain |
ubah juga file DatabaseSeeder.php
menjadi seperti di bawah ini, perhatikan urutannya agar tidak terjadi error ketika kita melakukan seeder :
1 2 3 4 5 6 7 8 9 10 11 |
// code lain public function run() { $this->call(KotaSeeder::class); $this->call(UserTableSeeder::class); $this->call(KendaraansTableSeeder::class); $this->call(ProfileSeeder::class); $this->call(RolesSeeder::class); $this->call(RolesUsersSeeder::class); } // code lain |
jika sudah, silakan kalian tutup semua filenya, karena sudah banyak file yang kita buka. Setelah itu kita perlu menambahkan route baru di web.php
seperti ini :
1 2 |
// code lain Route::get('/has-many-through/{id?}', 'BelajarController@hasManyThrough'); |
kita akan menampilkan data semua kendaraan yang ada di kota Magetan dengan parameter id dari tabel kota. Setelah itu tambahkan satu method di BelajarController.php
seperti di bawah ini :
1 2 3 4 5 6 7 8 9 10 |
// code lain public function hasManyThrough($id = 1) { $title = 'Has Many Through Relationships ONPHPID.'; $content = 'Saat ini kita belajar relasi Has Many Through.'; $kota = \App\Kota::find($id); return view('has_many_through', compact('kota', 'title', 'content')); } // code lain |
jika sudah mari kita buat satu view baru dengan nama has_many_through.blade.php
dan tambahkan code di bawah ini :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@extends('layouts.app') @section('title', $title) @section('content') <center> <h1>{{ $title }}</h1> <p>{{ $content }}</p> Kendaraan yang ada di kota <strong>{{ ucwords($kota->nama_kota) }}</strong> : <ul> @foreach($kota->kendaraans as $kendaraan) {{ strtoupper($kendaraan->nama_kendaraan) }} <br/> @endforeach </ul> </center> @endsection |
jika semua sudah, akhirnya kita selesai.
Masih ingat kan apa yang harus kita lakukan? Iya.. benar kita perlu melakukan migrate dan seeder. Namun sebelum migrate sebaiknya kita rollback dulu semua tabel yang pernah kita migrate, karena kita melakukan perubahan pada tabel users. Ketikan perintah sebagai berikut :
1 |
php artisan migrate:rollback |
kemudian
1 |
php artisan migrate |
terakhir
1 |
php artisan db:seed |
jika berhasil maka akan tampak seperti gambar di bawah ini :
setelah itu kita cek di browser apakah kita berhasil menampilkan semua kendaraan yang berada di kota Magetan, dengan mengakses localhost:8000/has-many-through
. Jika tidak ada kesalahan maka akan tampil seperti gambar di bawah ini :
Alhamdulillah kita sudah belajar tentang Has Many Trough. Jika belum paham dapat membaca secara langsung dokumentasi laravel di sini.
Baca Juga : Many To Many Eloquent Relationships Pada Laravel 5.3 Untuk Pemula
Sekian dulu tutorial Belajar Laravel : Apa itu Has Many Through Relationships? Pada Laravel 5.3 untuk pemula. Jika ada hal yang kurang jelas atau ingin ditanyakan dapat melalui komentar. JANGAN LUPA like FANSPAGE ONPHPID untuk update informasi dan Subscribe Channel ONPHPID Tutorial. Selamat Belajar…