Eloquent ORM (Object Relation Maping) adalah fitur di laravel untuk menjalankan Query - query di database mulai dari insert, update, delete dan read data serta dapat memanggil relasi antar tabel.

Di tutorial sebelumnya sudah kami bahas tentang Belajar MVC (Model, View dan Controller) di laravel 5.7. Tutorial ini kelanjutan dari sebelumnya.

Pada tutorial sebelumnya kita sudah membuat migrasi, model dan controller beserta sample data menggunakan seeder.

Saatnya kita mulai untuk melakukan Query - query sederhana untuk menampilkan data dari database beserta relasi antar tabel ke blade template laravel, lebih lengkapnya nanti kami bahasa pada tutorial CRUD laravel 5.7.

Dalam toturial sebelumnya sudah kami bahas untuk menampilkan data dari database, serta memanggilnya menggunakan slug.

 

data berdasarkan slug

Kita mulai dengan menampilkan relasi post beserta relasinya yaitu user dan kategori.

Pertama, ubah dulu model Post dengan cara buka file app/Post.php, kemudian salin dan paste script dibawah ini dan simpan.

//app/Post.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    //many to one
    //banyak post di miliki oleh satu kategori
    public function category(){
        return $this->belongsTo('App\Category'); //membuat relasi dengan tabel category
    }
    //many to one
    //banyak post dimiliki oleh satu user
    public function user(){
        return $this->belongsTo('App\User'); //membuat relasi dengan tabel users
    }
}

Ubah script view index.blade.php di folder posts.

<h3>Daftar Posts</h3>
<ul>
@foreach($posts as $post)
<li>Judul : {{$post->judul}} | Oleh : {{$post->user->name}} | Kategori : {{$post->category->name}} | <a href="detail/{{$post->slug}}">Lihat Detail</a></li>
@endforeach
</ul>

Ubah juga script view show.blade.php di folder posts.

<h2>Judulnya : {{$post->judul}}</h2>
<ul>
<li>Deskripsinya : {{$post->body}}</li>
<li>Kategorinya : {{$post->category->name}}</li> // memanggil object name pada relasi category
<li>Oleh : {{$post->user->name}}</li> // memanggil object name pada relasi user
<li>Dibuat : {{$post->created_at->format('d M Y | h:i:s')}} WIB
</ul>

Setelah itu jalankan "php artisan serve" pada project Anda dan akses http://localhost:8000/posts kemudian klik lihat detail pada salah satu post.

daftar posts dengan relasinya

menampilkan detail berdasarkan slug dan relasinya

Tips sebelum menampilkan data object dari suatu relasi, kami sarankan untuk memanggil nama relasinya terlebih dahulu yang telah kita daftarkan di model terkait. Misalnya kita mau menampilkan object pada relasi post dan user, ada baiknya kita akses dengan menggunakan script berikut:

<h2>Judulnya : {{$post->judul}}</h2>
<ul>
<li>Deskripsinya : {{$post->body}}</li>
<li>Kategorinya : {{$post->category->name}}</li>
<li>Oleh : {{$post->user}}</li> // Kita panggil dulu nama relasinya yaitu user
<li>Dibuat : {{$post->created_at->format('d M Y | h:i:s')}} WIB
</ul>

Sehingga tampilannya seperti dibawah ini :

cek relasi di laravel

Data object yang ada pada relasi user akan terlihat, misal kita ingin menampilkan post dengan email user caranya cukup seperti dibawah ini : 

{{ $post->user->email }} // kita panggil relasi user kemudian kita panggil object email

Selanjutnya kita coba untuk menampilkan relasi users dengan posts, yaitu menampilkan user beserta post yang terkait.

Kita buat controller baru bernama UserController, jalankan perintah berikut :

php artisan make:controller UserController

Salin dan paste script dibawah ini pada UserController.php yang baru saja kita buat.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;
class UserController extends Controller
{
    public function show($id){
        $user = User::where('id',$id)->firstOrFail(); //melakukan query di database berdasarkan kolom id yang di dapat dari parameter $id bila tidak ditemukan maka menampilkan halaman 404
        return view('users.show',compact('user'));
    }
}

Kita buat folder baru bernama users sejajar dengan folder posts pada folder resources>views.

Kemudian buat file view baru bernama show.blade.php pada folder users, salin dan paste script dibawah ini kedalam file tersebut :

<h2>Name : {{$user->name}}</h2>
<ul>
<li>Email : {{$user->email}}</li>
</ul>

Selanjutnya kita daftarkan route baru di web.php, sehingga menjadi seperti dibawah ini :

<?php

/*
| Web Routes
*/

Auth::routes();

Route::get('/posts', '[email protected]')->name('indexPost');
Route::get('/detail/{slug}','[email protected]'); // {slug} adalah parameter slug
Route::get('/user/{id}','[email protected]'); // {id} adalah parameter id

Setelah itu coba akses http://localhost:8000/user/1. Sehingga tampilannya seperti berikut :

menampilkan user

Angka 1 diatas adalah sebuah parameter id yang kita daftarkan di route path tadi yang dapat kita panggil didalam controller.

Lalu saatnya kita memanggil data user beserta relasi posts.

Buka model User pada file app>User.php, salin dan paste script dibawah ini :

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
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',
    ]; //properti yang diperbolehkan untuk dilihat

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ]; //properti yang disembunyikan


    //one to many
    //satu user memiliki banyak post
    public function posts(){
        return $this->hasMany('App\Post');
    }
}

Buka file view show.blade.php pada folder users salin dan paste script dibawah ini kedalam file tersebut.

<h2>Name : {{$user->name}}</h2>
<ul>
<li>Email : {{$user->email}}</li>
<li>Post : 
@if(count($user->posts)) //cek apakah user memiliki posts
    <ul>
    @foreach($user->posts as $post) // kemudian kita ubah data array ke dalam bentuk object
        <li>{{$post->judul}}</li> // menampilkan object judul
    @endforeach
    </ul>
@else
No Post // jika tidak terdapat post
@endif
</li>
</ul>

menampilkan relasi user dengan postKita juga bisa loh menampilkan user dengan posts beserta relasi post dengan kategori di laravel. Caranya cukup panggil juga nama relasi category pada relasi post. Sehingga scriptnya seperti dibawah ini :

<h2>Name : {{$user->name}}</h2>
<ul>
<li>Email : {{$user->email}}</li>
<li>Post : 
@if(count($user->posts))
    <ul>
    @foreach($user->posts as $post)
        <li>Judulnya : {{$post->judul}} | Kategori : {{$post->category->name}}</li>
    @endforeach
    </ul>
@else
No Post
@endif
</li>
</ul>

menampilkan relasi user, post dan kategori

Taraa... relasinya bisa kita panggil juga, cukup mudahkan untuk memanggil relasi pada laravel. Semoga bisa mudah kalian pahami dan jangan lupa semangat yaa belajarnya... hehe.


Wahyu Prasetyo
Wahyu Prasetyo Hanya manusia biasa yang berilmu dan ingin bermanfaat untuk orang lain.