Hallo apa kabar teman-teman ONPHPID, baik bukan? Masih ingat kan sebelumnya kita sudah Belajar Laravel : Memahami One To One Relationships Pada Laravel 5.3 part 1. Pada tutorial sebelumnya kita sudah membuat Model Profile sekaligus migrations dan seedernya. Nah, kali ini kita akan menampilkan data dari kedua Model User dan Profile yang sudah kita buat pada tutorial sebelumnya. Namun sebelumnya kita harus mendefinisikan relasinya di Model Profile dan Model User. Bagaimana membuatnya? mari kita buka dulu project yang sudah kita buat.
Silakan buka Model User yang berada di app/
kemudian buatlah agar menjadi seperti di bawah ini :
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 |
<?php namespace App; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { use Notifiable; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'email', 'password', ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; /** * Untuk mendapatkan data profile yang berelasi dengan User. */ public function Profile() { return $this->hasOne('App\Profile'); } } |
dari code di atas kita sudah mendefinisikan relasi antara User dengan Profile yaitu hasOne
, artinya satu User hanya akan memiliki satu Profile. Jika kita membuatnya seperti di atas, kita harus memiliki kolom tabel profiles
yang menjadi foreign Key yaitu user_id
. Namun jika kita menggunakan nama kolom dengan nama id_user
, kita harus mendefinisikan relasinya seperti berikut :
1 2 3 4 5 6 7 8 9 |
// code lain /** * Untuk mendapatkan data profile yang berelasi dengan User. */ public function Profile() { return $this->hasOne('App\Profile', 'id_user'); // kita definisikan foreign keynya } // code lain |
karena Laravel akan berasumsi bahwa foreign key dari sebuah relasi adalah nama Model dengan tambahan _id
. Jadi jika Modelnya User akan dianggap user_id
. Kita juga dapat mendefinisikan relasi seperti di bawah ini :
1 2 3 4 5 6 7 8 9 |
// code lain /** * Untuk mendapatkan data profile yang berelasi dengan User. */ public function Profile() { return $this->hasOne('App\Profile','foreign_key-nya', 'local_key-nya'); } // code lain |
jika sudah mari kita buka Model Profile, kita juga definisikan relasi untuk mengambil data User yang berelasi dengan Profile. Ubahlah Model Profile menjadi seperti di bawah ini :
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 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Profile extends Model { /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'nama', 'jenis_kelamin', 'alamat', 'no_telp', 'user_id', ]; /** * Sembunyikan data yang tidak boleh diakses umum. * * @var array */ protected $hidden = [ 'alamat', 'no_telp', ]; /** * Mendapatkan data User yang berelasi dengan Profile */ public function user() { return $this->belongsTo('App\User'); } } |
sama seperti pada Model User, kita juga dapat mendefinisikan jika foreignKey
table kita bukan user_id
seperti ini :
1 2 3 4 5 6 7 8 9 |
// code lain /** * Mendapatkan data User yang berelasi dengan Profile */ public function user() { return $this->belongsTo('App\User', 'foreign_key-nya'); } // code lain |
atau jika primaryKey
dari Model User bukan id, kita dapat mendefinisikannya seperti berikut :
1 2 3 4 5 6 7 8 9 |
// code lain /** * Mendapatkan data User yang berelasi dengan Profile */ public function user() { return $this->belongsTo('App\User', 'foreign_key-nya', 'primary_key-nya'); } // code lain |
jika sudah mari kita buat satu route di routes/web.php
, kita akan menggunakan Controller yang sudah pernah kita buat yaitu BelajarController.php
. Tambahkan route berikut pada file web.php
:
1 |
Route::get('/one-to-one', 'BelajarController@getOne'); |
dan tambahkan satu method di BelajarController.php
seperti di bawah ini :
1 2 3 4 5 6 7 8 9 10 |
// code lain public function getOne() { $title = 'One To One Relationships ONPHPID.'; $content = 'Saat ini kita belajar relasi One To One.'; $users = \App\User::get(); return view('home.index', compact('title', 'content', 'users')); } // code lain |
karena kita akan melempar data ke home/index maka kita buka file index.blade.php
di dalam direktori home yang pernah kita buat, kemudian tambahkan code hingga hasilnya seperti di bawah ini :
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 |
@extends('layouts.app') @section('title', $title) @section('sidebar') @parent <li>PHP</li> @endsection @section('content') <center> <h1>{{ $title }}</h1> <p>{{ $content }}</p> <table> <thead> <tr> <th>Username</th> <th>Email</th> <th>Nama Lengkap</th> <th>Jenis Kelamin</th> <th>Alamat</th> <th>No. Telp</th> </tr> </thead> <tbody> @foreach ( $users as $user ) <tr> <td>{{ $user->name }}</td> <td>{{ $user->email }}</td> <td>{{ $user->profile->nama }}</td> <td>{{ $user->profile->jenis_kelamin }}</td> <td>{{ $user->profile->alamat }}</td> <td>{{ $user->profile->no_telp }}</td> </tr> @endforeach </tbody> </table> </center> @endsection |
apakah kalian melihat perbedaan? jika iya berarti kalian teliti. Dari code di atas terdapat baris seperti ini
1 |
<td>{{ $user->profile->jenis_kelamin }}</td> |
bagian profile itulah yang kita definisikan di Model User di atas, mari kita check hasilnya di browser dengan mengakses url localhost:8000/one-to-one
. Jika tidak ada kesalahan maka akan tampil seperti gambar di bawah ini :
sekarang kita akan mencoba relasi sebaliknya, yaitu dari Profile ke User. Maka tambahkan code berikut di web.php
1 |
Route::get('/profile/{nama}', 'BelajarController@hasOne'); |
kemudian kita tambahkan satu method di bawah ini di BelajarController.php
1 2 3 4 5 6 7 8 9 10 |
// code lain public function hasOne($nama) { $title = 'One To One Relationships ONPHPID.'; $content = 'Saat ini kita belajar relasi One To One.'; $profile = \App\Profile::where('nama', $nama)->first(); return view('home.index2', compact('title', 'content', 'profile')); } // code lain |
setelah itu ubah index2.blade.php
yang pernah kita buat pada tutorial sebelumnya dan kita ubah hingga menjadi seperti ini
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
@extends('layouts.app') @section('title', $title) @section('sidebar') @parent <li>PHP</li> @endsection @section('content') <center> <h1>{{ $title }}</h1> <p>{{ $content }}</p> <p>Username : {{ $profile->user->name }}</p> <p>Email : {{ $profile->user->email }}</p> </center> @endsection |
jika sudah kita check di browser dengan url localhost:8000/profile/onphpid
, maka akan tampil data User sesuai nama yang kita akses pada url seperti gambar di bawah ini :
Alhamdulliah.. bagaimana teman-teman, berhasil kan? semoga kita menjadi lebih paham penggunaan Relasi One To One pada Laravel. Sengaja kita belajar pelan-pelan agar kita benar-benar bisa memahaminya. Pada tutorial selanjutnya kita akan belajar One To Many Relationships pada Laravel 5.3.
Baca Juga : Memahami One To One Relationships Pada Laravel 5.3 part-1
Sekian dulu tutorial Belajar Laravel : Memahami One To One Relationships Pada Laravel 5.3 untuk pemula part-2. 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…