Anda di halaman 1dari 10

>> Kita akan masuk untuk membahas mengenai keterhubungan antar tabel atau yang

namanya di
dalam laravel di sebut dengan Eloquent Relationship, atau hubungan antar model

>> Di dalam sistem blog kita, kita akan menerapkan sebuah kategori pada setiap
post di blog kita
bagaimana menghubungkan antara model kategori yang kita buat dengan model post
yang
sudah kita buat sebelumnya menggunakan fiturnya Eloquent

>> Kita kembali ke aplikasi kita, kita akan menambahkan kategori untuk setiap
postingan
blog kita, misalnya ada yang web programming, ada yang web design, ada yang
tulisan
tentang personal. Nanti si kategori itu akan menempel di setiap postingan,
istilahnya
kita bikin relasi antar tabel

>> Kita mulai dlu dari bikin model dan migrasi untuk kategori, kita kembali ke
kodingan.
Pertama kali kita bikin model dan migrasi dari kategori, sama seperti posts
yang
sudah kita lakukan sebelumnya

>> Caranya adalah buka terminal, bisa terminal dari vscode atau terminal terpisah
supaya
tampilan lebih luas kita ketikkan : php artisan make:model -m Category, lalu
tekan enter.
-m digunakan untuk membuat migrationnya sekalian. Untuk migration itu berupa
plural,
dan untuk model itu berupa singular

>> Jika sudah kita bisa cek model dan migration untuk category. Untuk migrationnya
kita bikin
fieldnya, dengan tipe data string dengan nama "name", lalu kita bikin field
slug, untuk
kategori, karena kita bikin halaman yang menampilkan semua kategori yang nanti
saat kategori
itu di klik, akan menampilkan halaman postingan yang sesuai dengan kategori
tadi
Misal :
Schema::create('categories', function (Blueprint $table) {
$table->id();
$table->string('name')->unique();
$table->string('slug')->unique();
$table->timestamps();
});

>> Kita butuh dua2nya unique, category gk boleh ada dua yang sama, begitu pula
slugnya,
karena nanti bakalan dipakai sebagai identifier juga. Jadi ini unique juga.

>> Selanjutnya gimana caranya menghubungkan antara tabel categories dan tabel
posts. Kita
harus bikin foreign key di dalam migrasinya posts. Jadi kita buka posts
migrationnya, disini
kita akan menambahkan satu field lagi dengan tipe data foreignId yang di
dalamnya dengan
nama "category_id"
Misal :
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->foreignId('category_id');
$table->string('title');
$table->string('slug')->unique();
$table->text('excerpt');
$table->text('body');
$table->timestamp('publish_at')->nullable();
$table->timestamps();
});

>> Jadi category_id akan menjadi foreign key untuk tabel categories, jika sudah
kita eksekusi
migrationnya dengan cara balik ke terminal, kita ketik php artisan
migrate:fresh. Oke
sekarang semua sudah di delete dan semua field sudah dibikin ulang

>> Sekarang ada categories, dan jika kita cek di tabel posts, di dalamnya sudah
ada field
category_id. Sekarang kita bikin isi data dari kategori. Caranya kita balik ke
terminal,
lalu kita ketik php artisan tinker untuk masuk ke tinker

>> Kita bikin variable baru dengan nama category, deklarasikan dengan Model
Category.
Selanjutnya kita bikin :
$category = new Category
$category->name = 'Programming'
$category->slug = 'programming'
$category->save()

>> Kita juga bisa pake cara create, tapi caranya kita pergi ke vscode, buat file
kosongan
lalu kita ketikkan :
Category::create([
'name' => 'Web Design',
'slug' => 'web-design'
])

>> Jika kita copas ke terminal, hasilnya akan error mass assignment, ada yang
harus kita
baiki, yaitu, kita balik ke model category di bawah use HasFactory; kita bikin:
protected $guarded = ['id'];

>> Jadi jagain hanya field id saja, sisanya boleh pakai mass assignment, setelah
selesai
kita keluar dari tinker dengan menekan ctrl+c, lalu masuk lagi dengan
mengetikkan php
artisan tinker. Lalu kita copas kodingan tadi jika sudah, kita tekan enter.
Maka sudah
tidak ada error.

>> Lalu kita ubah name dan slugnya dengan nama personal untuk membuat category
baru. Jika
sudah copas kembali ke terminal, lalu tekan enter. Jika kita cek lagi
Category::all()

>> Maka ada 3 kategori, programming, web design dan personal. Selanjutnya, kita
coba isi
postingan, kita bikin beberapa postingan yang konekin secara manual ke kategori
yang ada

>> Kita bikin seperti ini :


Post::create([
'title'=>'Judul Pertama',
'slug' => 'judul-pertama',
'excerpt' => '<p>Lorem ipsum dolor sit amet consectetur adipisicing elit.
Ullam, magnam?',
'body' => Lorem ipsum dolor sit amet consectetur adipisicing elit. Dicta
dolorem eaque vero, libero unde, consequatur pariatur eos dignissimos consectetur
aliquam earum nihil laboriosam itaque obcaecati quo reprehenderit et quam facilis
at harum dolore, corrupti tempore repellat. Voluptatibus, soluta accusantium,
molestias, eos repudiandae repellendus quo quas dolor voluptates impedit nostrum
perspiciatis! Recusandae illo optio minus tenetur qui vero suscipit iure, impedit
pariatur ea iste earum delectus quas obcaecati velit praesentium ut nesciunt
molestias labore reiciendis laudantium quo totam, voluptatibus porro. Dolores,
explicabo. Eligendi minima ullam ducimus aut, molestias voluptate iure, laboriosam,
nostrum corrupti soluta nobis aspernatur ex placeat neque! Reprehenderit similique
in deserunt earum, perferendis dolores quas non consequuntur quibusdam minus nemo
commodi, neque architecto magnam eveniet est, tenetur accusantium ipsam.</p> <p>
ipsum dolor sit amet consectetur adipisicing elit. Aspernatur officiis consectetur
repellat voluptates facilis doloremque dolorum praesentium rem omnis magni!</p>
<p>Lorem ipsum dolor sit, amet consectetur adipisicing elit. Harum in dolorem quo
nulla sint autem nesciunt architecto! Perspiciatis, placeat! Officiis?</p>'
])

>> Jika sudah, kita tambahkan field category_id yang sudah kita buat sebelumnya di
bawah title
Misal :
'category_id' => 1

>> Kenapa 1, karena di table categories, id bernilai 1 adalah Programming. Jika


semua dirasa
sudah benar baik kutip dan komanya sudah benar, kita copas ke terminal dimana
tinker ada

>> Lalu tekan enter. Kita bikin 1 postingan lagi dengan title dan slugnya Judul
Kedua,
lalu kita bikin kategorinya programming dengan category_id bernilai 1

>> Copas ke terminal. Jika sudah kita bikin satu lagi dengan category_id bernilai
3 untuk
kategori personal, kasih judul sama slugnya bernilai Judul Ketiga

>> Jika sudah copas lagi ke terminal. Jika sudah, sekarang kita punya 3 postingan,

selanjutnya jika kita ingin mencari postingan yang kategorinya programming,


kita tinggal
ketikkan saja di tinker Post::where('category_id',1)->get(), artinya ambilkan
semua
postingan yang kategorinya 1, jika di enter, maka ada 2 postingan yang muncul

>> Akan lebih keren jika kita mengetahui nama kategorinya apa. Kalau kita mau cari
nama
kategorinya caranya adalah menggunakan join antara tabel 1 dengan tabel 2
jika kita menggunakan sql. Kalau kita mau melakukan itu di Laravel, kita harus
tentukan
dlu relationship antar modelnya

>> Caranya kita cari tahu di dokumentasinya, kita ketik relationship, jika sudah
kita temukan
Eloquent:Relationships, disini kita bisa membaca detil penjelasannya, kita
masuk ke bagian
introduction

>> Kalau kita lihat di Introduction. Tabel di dalam database kita biasanya
berelasi satu sama
lain. Contohnya, kalau kita bikin sistem blog, sebuah blog itu mungkin aja bisa
memiliki
banyak komentar

>> Kalau kita bikin fitur komen, satu post bisa punya banyak komentar. Komentar
ini selain
berelasi dengan postnya, pasti juga berelasi dengan siapa yang menuliskannya.
Jadi
nanti kemungkinan besarnya berelasi dengan tabel atau model user. Jadi post
bisa berelasi
dengan comment, bisa berelasi dengan user

>> Denagn Eloquent, kita bisa mengelola dan bekerja dengan relationship ini
menjadi gampang
dan mendukung beberapa macam relationship yang kita kenal di dalam database

>> Jadi sebelum kita masuk ke dalam Eloquent, kita harus paham relasi antar tabel,
khususnya
di MySQL. Seperti apa itu One to One, One to Many, dan Many to Many. Sebenernya
3 ini yang
harus dipahami

>> Kita harus paham mengenai konsep database, konsep tabel dan konsep relasi di
MySQL. Sebelum
nanti kita implementasi ke Eloquentnya

>> Di Dokumentasi Laravel ada cara bikin relasi dan cara kodingnya, tapi sebelum
masuk kesana
kita akan mengetahui konsep dan teorinya

>> Table Relationship <<

>> Kita tahu sekarang kita sudah punya sebuah tabel posts di MySQL kita yang
fieldnya
ada id, title, slug, excerpt, body, dan published_at. Sekarang ceritanya kita
menghubungkan
tabel posts dengan tabel categories yang di dalamnya ada field id, name dan
juga slug

>> Kita ingin setiap post, nantinya punya sebuah kategori, ada postingan yang
kategorinya
misalnya web programming, ada postingan yang kategorinya web design ataupun
personal

>> Cara menghubungkan tabel categories dengan tabel posts. Pertama, kita harus
hubungkan
dari sisi data definitionnya dulu, biasanya dengan cara kita menambahkan sebuah
foreign key
Kita pasang foreign key di tabel posts sehingga tabel categories bisa berelasi
dengan
tabel posts

>> Lalu kita juga harus tentukan kardinalitasnya/Relasi antar tabel, apakah One to
One,
One to Many, Many to Many. Kalau balik ke kasus kita kita tentukan hubungannya
gimana
antara tabel categories ke tabel posts

>> Jadi kita pengen 1 category bisa memiliki banyak post, pasti post yang kita
bikin banyak,
mungkin ada 10 post, 3 di antaranya web programming, 5 diantaranya web design,
2 diantaranya
personal misalnya

>> Jadi 1 kategori, bisa memiliki banyak post, kalau kita lihat dari sisi
kategori, maka
kardinalitasnya adalah 1 ke n, atau satu ke banyak. 1 kategori memiliki banyak
post

>> Selanjutnya, kardinalitas ini punya kebalikannya juga, atau dari sisi postnya
atau di
Eloquent nyebunya inverse relationship

>> Sekarang kita lihat dari sisi post ke kategories. Kita ingin satu post hanya
memiliki
satu kategori. Jadi tidak boleh ada 1 post yang memiliki lebih dari 2 kategori.
Kalau
kita mau melakukan itu, kita bisa menggunakan fitur tags, tapi karena kita
maunya
kategori, berarti 1 post hanya memiliki 1 kategori atau nama relasinya adalah
One to One

>> Jadi kalau kita hubungkan dengan Eloquent, bacanya gini, one categories hasMany
posts,
kebalikannya one posts belongsTo one categories, relationship utamanya adalah
categories
makanya categories yang punya hasMany

>> Kalau misalnya dari categories ke post 1 ke 1, nanti tulisnya hasOne, kalau
dari posts
ke categories 1 ke banyak, kita bisa tulis belongsToMany

Contoh Kedua :

>> Misalnya kita punya dua tabel posts dan users, kita ingin menghubungkannya
dengan
Eloquent. Jadi ceritanya postingan yang kita tulis pasti ada user yang
nulisnya, makanya
di tabel posts kita sisipkan foreign key baru dengan nama user_id sebagai
foreign key
untuk tabel users

>> Jika kita lihat, cara penulisan foreign key secara default adalah versi
singular dari nama
tabel_id. Kita bisa menggunakan nama lain tapi harus dikasih tau nantinya ke
laravelnya

>> Kalau mau gampang, langsung aja kasih versi singular_id. Kita tentukan
kardinalitas
antara posts ke users dan users ke posts. Jadi kardinalitasnya adalah post
belongsTo
users dan users hasMany posts

Contoh Ketiga :

>> Kita memiliki tiga tabel, yaitu tabel posts, tabel comments dan tabel users,
kita tentukan
kardinalitas antara posts dengan comments, comments dengan posts, comments
dengan users
dan users dengan comments. Kardinalitasnya adalah one posts hasMany comments,
one comments
belongsTo one posts, one comments belongsTo one users dan one users hasMany
comments

>> Alasan kardinalitasnya seperti itu, karena foreign key dari tabel users dan
tabel posts
ada di tabel comments

>> Jika sudah paham kita balik ke dokumentasi laravelnya. Kalau lebih ingin paham
tentang
relasi, langsung masuk saja ke sub kategorinya, misalnya kita sudah tahu kalau
relasi
di tabel kita One to One, kita bisa lihat contoh pembuatannya

>> Selanjutnya kita masuk ke modelnya post, caranya dengan menekan ctrl + p lalu
ketikkan nama
modelnya. Kalau kita mau menghubungkan model post dengan model category, kita
harus
membuat method baru di dalam classnya dengan cara mengetikkan :

public function category(sesuai dengan nama modelnya)(){


return $this->belongsTo(Category::class);
}

>> Kita bikin method yang mengembalikan relasi dari model post terhadap model
category. Misalnya
kita ingin agar 1 postingan hanya punya 1 kategori, ini bisa kita kasih namanya

belongsTo(Category(nama modelnya)::class);

>> Hasilnya model post sudah berelasi dengan model category, cara ngeceknya kita
ke tinker
Kalau misalkan kita ambil salah satu postingannya, misal kita bikin variable
namanya
post yang berisi model post dengan data postingan pertama
Misal :
$post = Post::first()

>> Jika kita tekan enter, maka akan muncul postingan pertama. Jadi sekarang
variable $post
sudah berisi postingan pertama, selanjutnya kita cek kategorinya dengan cara :

$post->category

>> Jadi nanti akan dicarikan data dari kategori yang sesuai dengan variable $post

>> Karena category_id nya 1, maka dia dapat seluruh instance dari tabel kategori.
Jika kita
ingin tahu nama kategori dari psotingan pertama itu apa, kita tinggal
ketikkan :

$post->category->name

>> Maka akan ditampilkan nama dari kategori di variable post yang kita buat, tanpa
kita
melakukan join secara manual

>> Sekarang kita akan terapin ke halaman web kita. Kita ingin pada saat klik 1
judul, nanti
di bawah titlenya ada tulisan, ditulis oleh siapa, di dalam kategori apa

>> Jadi kita buka di web browser single post dlu. berarti kita buka view post,
cari yang
single post

>> Kita bikin tag p di bawah title misalnya kita tulis :


<p>By. Ryan Dhika Permana in Programming</p>

>> Jika cek di web browser kita ingin seperti ini. Jika kita ingin ambil datanya
dari database
caranya adalah kita langsung gunakan {{$post->category->name}}
Misal :
<p>By. Ryan Dhika Permana in {{ $post->category->name }}</p>

>> Jika kita cek di web browsernya, hasilnya akan sama. Kalau kita balik ke
postingan lain,
maka kategorinya akan berubah sesuai dengan database

>> Kalau misal kita bikin categorynya bisa di klik, maka dia akan menampilkan
semua post yang
kategorinya programming

>> coba kita bungkus ke dalam tag a, lalu dengan menggunakan href, kita arahkan ke
categories
dan ngirimin slugnya dari kategori ini dengan menggunakan blade
Misal :
<p>By. Ryan Dhika Permana in <a href="/categories/{{ $post->category-
>slug }}">{{ $post->category->name }}</a></p>

>> Jika kita cek di web browser, maka akan muncul link pada nama kategorinya,
ketika di klik
akan terjadi error, karena kita tidak memiliki view dan routes untuk
menampilkan datanya

>> Caranya kita ke routes atau file web lalu ketikkan :


Route::get('/categories/{category:slug}', function (Category $category) {
return view('category', [
'title' => $category->name,
'posts' => $category->posts,
'category' => $category->name
]);
});

>> Jadi kita bikin route baru yang akan mengarah ke categories, baru dia ngambil
data
category nya, kalau mau kita terapkan routes model binding. Seperti yang sudah
kita
lakukan sebelumnya, kita bikin closures, kita bikin function langsung kita
kasih class
categorynya, di dalamnya kita akan mengembalikan untuk arahkan ke view, nanti
kita akan
bikin file viewnya untuk category

>> Nantinya di dalamnya akan menampilkan postingan sesuai kategori yang kita
pilih. Kita
kirim datanya kita kirim title dengan nilai nama kategorinya, lalu kita kasih
juga
semua postingannya yang merupakan bagian dari kategori itu

>> $category->posts, ini kebalikannya dari yang kita lakukan di post tadi, klo ini
artinya
satu kategori bisa punya banyak posts. Nantinya kita harus balikin relasinya.
terakhir
kita butuh nama kategorinya untuk dikirimin.

>> Akan terjadi error pada class Category di function karena di halaman routes ini
butuh
menggunakan model category, caranya dengan menuliskan use App\Models\Category;
di bawah penggunaan PostController

>> Selanjutnya kita coba bikin viewnya, baru nanti kita bikin relasinya. Kita
bikin viewnya,
dicontek dari view posts nya. Kita buka view posts, lalu kita save as dengan
nama category

>> Kita edit2 dlu file category headingnya kita ubah menjadi Post Category : lalu
kategori
nya apa, cara untuk mendapatkan kategorinya apa, diambil dari file web, jadi
langsung tulis
{{$category}}
Misal :
<h1 class="mb-5">Post Category : {{ $category }}</h1>

>> Jika kita coba refresh di web browsernya, maka jika kita klik satu kategori,
maka akan
terjadi error, karena postnya tidak ada isinya, karena kita belum balikin
relasinya, tadi
kita hanya bikin relasi untuk posts sedangkan untuk kategori belum

>> Jadi kita buka model kategori kita, kita berikan method yang mengarah ke post.
Method ini
untuk menghubungkan category dengan post, kita akan return relasinya seperti
ini :
public function post()
{
return $this->hasMany(Post::class);
}

>> Jika kita cek pake tinker, kita bikin variable baru dengan nama category yang
berisi
model kategori dengan urutan data pertama
Misal :
$category = Category::first()

>> Kalau kita tulis $category->post, ketika tekan enter, data yang akan
ditampilkan ada 2,
karena ada dua data postingan yang memiliki kategori yang sama, yaitu
programming

>> Ketika kita cek di web browser, akan terjadi error saat mengklik link kategori,
karena
ketika kita lihat di routes yang kita ambil adalah posts, bukan post.
Tapi di model Category kita menggunakan post. Jadi kita ganti :
public function posts()
{
return $this->hasMany(Post::class);
}

>> Jika sudah di ubah, ketika di cek di browser, akan tampil dua data dengan
category
programming

>> Kalau kita balik ke view posts, kalau kita klik link judul ketiga, dia
categorynya
personal, kalau kita klik link personal, akan tampil kategori personal dengan
postingannya
cuman ada 1 karena kita bikin postingannya cuman 1

>> Kita akan bikin satu routes lagi untuk menangani ketika kita ingin urlnya ke
categories,
jika kita pencet enter, maka akan tampil semua category yang ada. Pertama2 kita
bikin
routesnya dlu :
Route::get('/categories', function () {
return view('categories', [
'title' => 'Post Categories',
'categories' => Category::all()
]);
});

>> Kita bikin routes dengan function/closuresnya berupa mengembalikan view


categories
yang nantinya kita akan buat viewsnya. title dibuat secara manual dan
categories digunakan
untuk mengambil semua data category nya, sama seperti ketika kita buat index di

PostController

>> Isinya kita contek dari view category, jadi kita buka view category, save as
dengan
nama categories. Jadi nanti kita looping category nya seperti ini :

@extends('layouts/main')

@section('container')
<h1 class="mb-5">Post Categories</h1>

@foreach ($categories as $category)


<ul>
<li>
<h2><a href="/categories/{{ $category->slug }}">{{ $category-
>name }}</a></h2>
</li>
</ul>
@endforeach

@endsection

>> Ketika di coba di web browser dengan url /categories, langsung muncul nama
kategorinya,
ketika di klik salah satunya, akan menampilkan postingan dengan kategori
tersebut. Karena
postingan dengan kategori web design belum ada, maka tampilannya akan kosong

>> Kita bisa menambahkan kondisi ketika datanya kosong tampilkan saja tulisan atau
alert, tapi
kalau ada datanya, maka data akan tampil

Anda mungkin juga menyukai