Anda di halaman 1dari 12

>> Kita akan memperbaiki model post kita yang dibuat secara manual agar membuat

modelnya
dengan cara yang benar. Kita bisa buka Model Post kita dengan mengklik app,
lalu Models,
lalu buka file Post.php

>> Di file Post.php, kita buat secara manual, kita tidak hubungkan ke model
miliknya laravel
kita bikin datanya manual, tidak lewat database, kita juga bikin 2 method
secara manual.
Padahal sebetulnya di dalam collection laravel nantinya, kita bisa pakai all
dan find ini
bahkan lebih banyak lagi.

>> Jadi sebagai saran, file Post.php bisa dihapus, karena kita akan bikin ulang,
tapi kalau
kita pengen ada history belajarnya, kita bisa merename nama dari file Post.php
menjadi
Post_, supaya tidak hilang, tapi file tersebut tidak dijalankan sebagai model
kita

>> Sekarang kita akan bikin modelnya, bisa dengan menggunakan perintah artisan
pada terminal
bisa dengan terminal visual studio code

>> Untuk membuat model kita ketikan perintah php artisan make:model, ini untuk
membuat model,
nanti setelah kita bikin model, kita bikin migrationnya, untuk membuat schema
tabel post
kita

>> Jadi kita harus bikin dua kali, tapi ada cara agar kita bisa bikin model dan
migrasi
secara bersamaan dengan satu kali command, perintahnya kita tambahkan help
setelah
mengetikkan php artisan jika kita bingung command2 untuk membuat file di
laravel apa saja
Misal :
php artisan help make:model

>> Jika kita tekan enter, maka ada penjelasan bahwa make model ini untuk bikin
eloquent model
caranya kita tulis make:model lalu kita bisa kasih optionnya, bisa di depan,
bisa tulis
di belakang, lalu nama modelnya apa

>> Jadi kalau misalnya kita bikin make:model Post, maka nanti akan dibikinkan file
class
model kita, tapi kita juga bisa kasih di akhirnya opsi atau flagnya, misalnya
kita
tambahkan -m, maka nanti otomatis ditambahkan file migrasi, -f nanti
ditambahkan file
factory, -c ditambahkan controller, dll

>> Jadi nanti kita akan tuliskan php artisan make:model -m, ini kalau kita mau
ketik manual
tapi kalau kita mau pakai perintah di vscode cukup kita tekan "ctrl+shift+p",
untuk ngeluarin
command palettenya, lalu kita ketik artisan:make model, nanti kalau kita
lakukan seperti
ini, kita bisa minta agar migrasinya juga otomatis dibuatkan

>> Jadi tinggal pilih, jika kita lakukan di terminal, maka jangan lupa nama
modelnya ditulis
Misal : php artisan make:model Post -m

>> Jadi nanti akan dibuatkan 2 file, yang pertama modelnya dibikin lalu
migrationnya dibikin
Otomatis nama migrationnya akan plural atau jamak, karena nama model kita itu
singular

>> Post dan posts. Jika di cek di dalam folder Model kita sudah ada file Post yang
dibikin
langsung oleh artisan, sudah dihubungkan semua yang kita butuhkan dan juga di
dalam folder
database ada folder migration, sekarang nambah 1

>> Kalau di video sebelumnya kita sudah lihat ada 3, users passwords, dan
failed_jobs, sekarang
nambah lagi ini create_posts_table. Selanjutnya kita buka file tersebut, lalu
kita bikin
skema databasenya disini

>> Jika sudah maka cari method up(), dimana kita membuat blueprintnya disini.
Kira2 field
apa saja yang dibutuhkan, yang jelas kita butuh id sebagai primary keynya kita
juga butuh
timestamps untuk membuat field created_at dan updated_at. Dan ditengah-
tengahnya kita
akan bikin untuk post, misalnya kita bikin table dengan tipe data string yang
nama tabelnya
adalah title

>> Selanjutnya kita akan butuh slug, tapi nanti slug akan ditambahkan di akhir,
jadi sekarang
kita skip dlu slugnya, jadi sekarang kita bikin field yang namanya excerpt,
yang digunakan
untuk menyimpan sebagian kecil dari tulisan didalam body blog kita, sehingga
nanti kita
bisa ada tulisan read more

>> Tipe datanya kita gunakan text saja, lalu kita buat field baru dengan nama
body, tipe datanya
text juga, lalu kita bikin field untuk menyimpan tanggal kapan postingan kita
di publish
jadi akan membedakan dengan created_at yang ada disini, kalau ini menjelaskan
kapan
postingannya dibuat, mungkin aja nanti pada saat dibuat, kita masih dalam
bentuk draft,
belum publish

>> Nanti disini kita bikin yang tipe datanya itu timestamp(), dimana timestamps()
ini adalah
method untuk membuat created_at dan updated_at, sedangkan timestamp() digunakan
untuk
tipe data timestamp, yang namanya nanti publish_at dan ini boleh kosong dengan
menambahkan
->nullable()
Misal :
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('excerpt');
$table->text('body');
$table->timestamp('publish_at')->nullable();
$table->timestamps();
});

>> Selanjutnya kita jalankan migrasinya dengan menggunakan terminal, lalu ketikkan
php artisan
migrate. Maka jika di cek di databasenya, maka akan muncul table baru dengan
nama posts,
jika kita lihat isinya, masih kosong, tapi ada field2 yang sudah kita buat

>> Selanjutnya kita tambahkan beberapa post. Kita sudah ada tabelnya, kita akan
isi, caranya
bisa menggunakan tinker, dengan mengetikkan di terminal php artisan tinker,
jika sudah
masuk ke tinker, selanjutnya bikin instan dari tiap postnya

>> Caranya adalah bikin variable post yang berisi new Post, setiap mau bikin satu
contoh
data, pencet enter, nanti akan otomatis dicarikan aliasnya atau namespacenya,
kalau
kita nyimpennya bener, langsung bisa dilakukan

>> Kita bikin objeknya $post, lalu kita bikin isi dari field2nya
Misal :
$post->title = 'Judul Pertama'

>> Maka akan dibuatkan isi title dengan nama Judul Pertama, selanjutnya untuk
excerpt, supaya
kita bisa bikin lorem ipsum di dalamnya, kita bikin dlu file baru dengan
ekstensi html, di
dalamnya kita ketik lorem100 lalu tekan tab, maka otomatis akan dibuatkan lorem
sebanyak
100 kata

>> Ini nanti adalah isi dari blognya, tetapi di excerptnya kita ambil sebagian
saja, jadi
di copas sebagian tulisannya lalu pindahkan ke terminal
Misal :
$post->excerpt = 'Lorem, ipsum dolor sit amet consectetur adipisicing elit.
Libero
quis non totam incidunt excepturi sequi fugit corporis culpa
veniam
voluptatibus unde, ullam cupiditate eveniet!'

>> Lalu untuk body, kita copas keseluruhan dari lorem ipsumnya
Misal :
$post->body = 'Lorem, ipsum dolor sit amet consectetur adipisicing elit. Libero
quis
non totam incidunt excepturi sequi fugit corporis culpa veniam
voluptatibus unde, ullam cupiditate eveniet! Nulla quasi ducimus
alias?
Repellendus qui esse fuga reiciendis excepturi adipisci natus hic
ea.
Quos corrupti libero possimus, perspiciatis iusto veniam corporis
vel
eveniet quia, exercitationem repudiandae cumque dolorum iste eaque
quisquam nihil voluptates, temporibus adipisci dignissimos neque.
Explicabo, obcaecati quia eveniet velit placeat rem beatae, illum
animi
dignissimos sequi iste voluptatum in atque esse praesentium, iusto
iure.
Eum nostrum deleniti harum ipsa placeat, ea adipisci enim
consectetur
doloremque excepturi et quas iusto quod incidunt numquam.'

>> Ini adalah postingan yang pertama, kita baru bikin datanya, belum kita save,
caranya kita
tulis $post->save(), lalu tekan enter, jika sudah true, di phpmyadminnya kita
refresh,
maka data akan muncul.

>> Selanjutnya kita bikin satu lagi, dengan cara yang sama

>> Jika sudah bikin yang kedua, ketika di cek di database, maka akan ada data
kedua, jadi
kita sudah bikin dua buah postingan, sekarang kita udah bisa langsung coba
query isinya

>> Dengan menggunakan tinker, kita bisa langsung panggil modelnya dengan
mengetikkan
Post::, jika ingin lihat semua datanya kita ketikkan all() lalu tekan enter,
maka semua
data akan tampil

>> Jika ingin menampilkan data yang pertama kita tinggal ketik Post::first(), maka
akan tampil
data yang pertama

>> Jika ingin mencari field datanya kita bisa ketik Post::pluck('title'), maka
nanti akan
tampil semua judul yang ada di dalam postingan

>> Jika ingin cari data kedua kita tinggal ketik Post::find(2), artinya cari
postingan yang
id nya 2

>> Sekarang kita sudah punya di database kita, sekarang gimana kalau kita lihat di
webnya,
maka otomatis datanya sudah tampil, padahal kita tidak lakukan apa2 pada
viewnya, modelnya
dll, alasannya karena kalau kita balik ke model kita

>> Buka file Post.php di folder Models, sekarang kan yang dipakai sudah model baru
Post yang
baru, di dalam file tersebut tidak punya method all(), juga method find, tidak
seperti
file lama yang kita gunakan sebelumnya

>> Karena method all() dan find() sebetulnya sudah ada di dalam Laravel sehingga
pada saat
kita buka controller kita, dengan nama PostController, bisa dengan menekan
"ctrl+p" untuk
mencari controller, daripada kita buka sidebarnya

>> Isi controllernya jika kita lihat, method2nya sudah langsung bisa kita pakai
seperti
method all() dan find($slug), meskipun masih $slug, kalau kita klik Judulnya di
web
browser, maka masih error

>> Karena yang bisa dicari oleh laravel saat ini adalah id, maka dari itu kita
perbaiki, coba
kita buka view posts kita, dengan menekan "ctrl+p" lalu ketik posts, maka akan
langsung
ketemu view posts yang kita cari

>> Kita mengarahkan hrefnya ke $post["slug"], padahal bisa kita ganti dengan id,
jika di save
lalu di refresh web browsernya, maka ketika kita arahkan kursor ke Judulnya
maka di kiri
bawah akan mengarahkan sesuai dengan idnya, dan ini sudah menggunakan database

>> Nanti kedepannya, kita tidak akan lagi menggunakan notasi array, kita akan
pakai notasi
objek, dan kenapa tidak terjadi error, karena collection itu memungkinkan kita
bisa
mengakses menggunakan dua notasi itu, tapi nanti semuanya itu kata akan pakai
notasi
objek
Misal :
<article class="mb-5">
<h2>
<a href="/posts/{{ $post->id }}">{{ $post->title }}</a>
</h2>
<p>{{ $post->body }}</p>
</article>

>> Maka jika kita refresh, tampilannya tidak akan error. Selanjutnya, yang akan
kita ubah,
sekarang kita punya model, walaupun modelnya belum lengkap. Kita sudah punya
model, kita
sudah punya controller, tapi jika kita lihat di file post.blade.php di dalam
halaman ini,
kita menuliskan body post nya di dalam tag p

>> Nanti kedepannya mungkin saja, postingan yang dikirimkan itu beberapa paragraf,
mungkin
panjang, jadi mungkin aja tag p ini ada di dalam bodynya, misalnya nanti kalau
kita
kirimin tulisan yang terdiri atas dua paragraf, dan mungkin saja, tag p nya
sudah tertanam
di dalam setiap paragrafnya

>> Mungkin nanti kedepannya kita bisa menggunakan sebuah tools yang namanya
WYSIWYG
(What You See Is What You Get), supaya kita bisa dapetin format tulisan yang
kita inginkan
Misalnya kita beri paragraf pada lorem ipsumnya

>> Mungkin aja nanti di dalam isi dari field body ada tag htmlnya, jadi nanti tag
p akan kita
hilangkan, sekalian juga kita edit notasi arraynya ke notasi objek
Misal :
<h1>{{ $post->title }}</h1>

{{ $post->body }}

<a href="/posts">Back to Posts</a>

>> Sekarang kalau kita coba masukkan data baru, postingan ketiga, tapi yang ada
tag paragraf
nya, kira2 apa yang terjadi, kita buat judul dengan nama Judul Post Ketiga,
lalu excerpt
nya kita copas, tetapi tidak disertakan tag htmlnya, karena untuk excerpt,
masih kita tulis
di dalam tag paragraf, yang kita pedulikan hanya yang di dalam single postnya
saja

>> Untuk bodynya, kita copas semua beserta tag paragrafnya, jika sudah kita
save(). Setelah
bernilai true, kita perbaiki view dari file posts. Ubah body menjadi excerpt.
Supaya hanya
sedikit yang tampil

>> Begitu kita klik yang Judul Post Ketiga, maka masih ada tag p nya kita mau
justru tag p
nya dijalankan, bukan ditampilkan. Terjadi karena laravelnya berusaha untuk
mengamankan
isi dari variable kita di dalam string blade, Kalau kita pakai kurung kurawal
2, artinya
kita akan mencetak menggunakan php echo, sekalian ngejalanin html special chars

>> Jadi kalau ada elemen html di dalamnya, maka sama dia di escape. Kalau tidak
ingin
dilakukan seperti itu, kita ingin menampilkan apapun yang ada di dalam isi
variablenya
dan mengeksekusinya kalau misalkan itu tag html

>> Kita tidak menggunakan kurung kurawal 2, kita pakai kurung kurawal 1 !!
{!! !!}, lalu
di dalamnya kita tulis $post->body, kalau begini ini artinya tidak melakukan
escaping

>> Kalau kita mau melakukan ini hati2, pastikan kalau inputan yang dimasukkan itu
bebas dari
misalnya script yang aneh2, jadi kalau misalkan tulisan blog, kalau kita pengen
ada tag
htmlnya, ini gak apa2
Misal :
{!! $post->body !!}

>> Jika kita jalankan, akan menampilkan tulisan dan 2 paragraf, bukan lagi tag p
yang
dicetak ke halamannya. Selanjutnya kita coba untuk menambahkan satu data lagi,
tapi pakai
cara yang berbeda

>> Cara yang kita lakukan ini adalah kita bikin instan dari objek, lalu kita isi
tiap2
propertinya. Jadi objek Post properti title kita isi apa, objek post properti
excerpt
kita isi apa. Baru terakhir kita save

>> Sebenernya ada cara gampangnya, jadi kita ketik dlu di file html yang kita buat
untuk
lorem ipsum, lalu kita copas ke dalam tinkernya. Jadi caranya itu kita bisa
tulis nama
methodnya::create(). Jadi kita pakai method yang namanya create
Misal :
Post::create()

>> Di dalamnya, kita bisa kirimkan semua datanya sekaligus dalam bentuk array,
bahkan kita
bisa rapihkan dlu. Kita bisa isi arraynya dari mulai title hingga body
Misal :
Post::create([
'title' => 'Judul Keempat',
'excerpt' => 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Placeat
dolores dolore nam pariatur nesciunt laboriosam, provident culpa reiciendis cumque
suscipit possimus quidem impedit incidunt dignissimos non ratione id!',
'body' => '<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Placeat
dolores dolore nam pariatur nesciunt laboriosam, provident culpa reiciendis cumque
suscipit possimus quidem impedit incidunt dignissimos non ratione id!</p> <p>Non
explicabo id sit quibusdam assumenda illum rem porro odit tempora, rerum officiis.
Pariatur expedita sit sequi earum mollitia incidunt doloribus consequuntur quos
sint velit cupiditate quaerat quasi, ullam ducimus deleniti reprehenderit
voluptatem quod officiis quibusdam, amet asperiores?</p> <p>Eaque quia quisquam
doloremque minima voluptas, voluptate esse dolorem. Explicabo illo alias fugiat
earum libero! Optio eveniet maxime id corrupti. Molestiae saepe numquam neque.
Necessitatibus, ab sapiente. Pariatur obcaecati tempora exercitationem, enim in
iusto beatae totam laboriosam harum libero perferendis officia vero natus sapiente
adipisci distinctio eveniet quis non delectus dolore. Autem aliquam officiis
eligendi! Soluta, accusamus quas! Aliquid ab magnam porro fugiat eius minima saepe
vel sed nam eveniet pariatur, harum nesciunt neque quae quas at accusantium
aspernatur et explicabo assumenda. Illo, nam!</p>'
])

>> Misalnya seperti ini, satu kali perintah langsung dieksekusi, dan nanti
kayaknya pada saat
kita sudah bekerja dengan form ini yang akan kita lakukan. Kita akan pakai
create

>> Kalau nanti kita coba masukkan ke dalam tinker dengan mencopasnya. Maka tidak
langsung
masuk, ada error yang namanya mass assignment exception. Jadi laravel itu sudah
menangani
yang namanya mass assignment, jadi tidak boleh banyak properti langsung masuk
di dalam
tabel

>> Defaultnya tidak boleh dijagain, kecuali kita kasih tahu bahwa properti2 ini
boleh diisi
cara ngasih taunya kita bikin sebuah properti yang namanya fillable di dalam
model post
kita. Jadi nanti dikasih tahu ini boleh diisi pakai cara create, karena create
itu mass
assignment, jadi untuk menghindari error ini kita bisa kembali ke model post
kita
>> Tulis dibawah use HasFactory;, bikin access modifiernya protected lalu kita
bikin variable
namanya fillable, di dalamnya ada array untuk memberitahu field mana saja yang
boleh diisi

>> Kalau kita tidak tulis disini, maka field tersebut tidak bisa diisi pakai
create, dan
nantinya otomatis akan diisi sesuai dengan apa yang kita buat di dalam schema
atau migrasi
Kalau kita bikin default, maka akan dibuat isinya default, kalau dia
timestamps, maka yang
akan diisikan adalah waktu saat dia dibuat

>> Jadi yang kita boleh isi adalah title, excerpt, lalu body
Misal :
protected $fillable = ['title', 'excerpt','body'];

>> Lalu lakukan copas kembali di tinkernya, maka error yang tadi masih ada, jadi
solusinya
tinkernya harus di reset dlu. Karena dia belum membaca perubahan kita yang udah
di save
tadi, karena masih kesimpen di dalam cache nya

>> Solusinya adalah kita tekan ctrl + d, untuk exit atau ctrl + c, sama aja. Maka
akan keluar
dari tinkernya. Lalu masuk kembali ke tinker. Lalu tekan atas yang mengarah ke
php artisan
tinker

>> Lalu tekan enter, kalau sudah masuk kita clear dlu, errornya. Baru kita paste
lagi
kodingannya. Maka ketika kita tekan enter, tidak ada error dan data baru
dibuat. Jika kita
refresh tampilannya, maka akan ada Judul Keempat. Jadi penting harus menulis
fillable
yang digunakan untuk izin data mass assignment masuk ke database

>> Sebenernya ada kebalikannya dari fillable, itu namanya adalah variable guarded.
Misalkan
di dalamnya diisi array id. Maka id, tidak boleh diisi, sisanya boleh diisi.
Jadi
kebalikannya dari fillable

>> Coba kita ganti, bikin post baru, ganti kodingannya menjadi judul Kelima
sisanya samain
aja. Kita copas ke terminal, tetapi ini tidak langsung dipindahin saja, karena
ada perubahan
di Modelnya. Jadi kita keluar dlu, baru paste

>> Maka hasilnya tidak terjadi error dan data ditambahkan. Jadi tinggal pilih mau
fillable
atau guarded. Keduanya juga bisa kita pakai kalau kita mau menggunakan tipe
mass assignment
selain dari create. Misalnya kita mau udate

>> Kita bisa tulis Post::find(3), misalnya kita cari dlu postingan yang idnya 3,
lalu kita kasih
methodnya adalah update() yang dicari yang ketiga dlu, terus update, kita bisa
kasih array
di dalamnya apa yang mau kita ganti, misalnya judulnya, mau kita ganti jadi
judul ke Tiga
berubah
Misal :
Post::find(3)->update(['title' => 'Judul Ke Tiga Berubah']);

>> Jika kita tekan enter, maka akan bernilai true. Ini bisa berubah, karena di
bagian model
diperbolahkan title diubah, karena yang tidak boleh diubah hanya idnya saja

>> Jadi sekarang kita lihat lagi dengan mengetik Post::all(), maka akan berubah.
Atau pakai
cara yang lain untuk merubahnya dengan cara ketik Post::where, kita pakai
where, klo find
kan where id = berapa. Kalau pakai where kita bisa pakai yang lain, misalnya
kita mau ubah
postingan yang judulnnya apa

>> Misalnya where('title','Judul Ke Tiga Berubah'), jadi cari postingan yang


judulnya Judul
Ke Tiga Berubah, lalu update isinya misal excerptnya kita ganti jadi excerpt
post 3 berubah
kalau pencet enter ada tulisan 1, kalau misalnya 1 berarti ada 1 data yang
barubah

>> Kalau kita refresh, maka datanya akan berubah. Itu adalah cara menangani mass
assignment
karena nanti kita akan pakai cara yang itu. Selanjutnya kita akan membahas yang
namanya
Route Model Binding

>> Apa itu, Route Model Binding adalah pada saat kita menyuntikkan sebuah id, dari
model kita
ke dalam route kita, atau ke dalam controller, yang biasa kita lakukan adalah
kita akan
query record yang kita cari berdasarkan id tadi

>> Jadi kita kirimin id, nanti di dalam controller atau routenya kita, query, cari
postingan
yang idnya berapa. Laravel punya sebuah fitur yang namanya Route Model Binding
yang tugasnya
ngeskip apa yang kita lakukan tadi

>> Jadi si laravel akan langsung ngequery in supaya dapat langsung data sesuai
dengan apa yang
kita cari tanpa harus kirimin id, lalu kita query sendiri, jadi secara
otomatis, mengirimkan
instance dari model yang sesuai

>> Caranya, pada saat kita mendapatkan sesuatu dari URL kita, biasanya kan kita
tulisnya
user/{id} atau user/{slug}, kita kirimin wildcardnya kan gitu biasanya. Nah
kalau sekarang
kita langsung aja panggil instancenya kalau kita ngirimin post, nanti
kiriminnya post

>> Kalau kita kirimin user, nanti kita kirimin usernya, gk usah id lagi atau slug
lagi
tapi di dalam functionnya, ini parameternya kita langsung kasih type
hintingnya. Kita
langsung kasih tipe datanya bahwa dia itu adalah model yang namanya user
Misal :
Route::get('/users/{user}', function (User $user) {
return $user->email;
});

>> Kita harus perhatikan yang tulisan $user harus sama persis dengan apa yang kita
tulis
di dalam kurung kurawalnya. Kalau kita cek controller kita, kan yang kita
butuhin slug
tapi slugnya gk jalan. Karena sebetulnya yang kita kirim itu id, karena find
itukan
mencari id

>> Jadi kalau kita ganti menjadi $id, gk ada error. Kita cek web browsernya, kalau
kita
refresh, begitu kita klik Judul Pertama, maka akan mencari Post yang idnya 1,
jadi
dia query dlu, ambil idnya kita query

>> Sekarang kita bisa gk melakukan ini, coba kita cek web Routesnya, yang kita
kirimin kan
slug, sebenernya mau bebas apapun selama diterimannya pake variable apapun
bebas. Kalau
sekarang gk boleh bebas. Misalkan kita nulis post. Sebenernya slug juga bisa
karena nanti karena yang akan diterima adalah satu instance utuh dari Post,
makanya kita
kasih namanya post aja
Misal :
Route::get('posts/{post}', [PostController::class, 'show']);

>> Lalu ditangkap oleh controller kita, tidak lagi id, tapi post juga sama. Nah
sekarang
kita kasih di depannya model Post. Jadi diikat modelnya, karena namanya juga
Route Model
Binding

>> Jadi routesnya tadi, ngirimin model ke controller. diikat di fungsi yang
digunakan. Jadi
di kirimin ke fungsi shownya, udah gk perlu lagi kita cari berdasarkan id nya,
langsung
bisa jadi post
Misal :
public function show(Post $post)
{
return view('post', [
"title" => "Single Post",
"post" => $post
]);
}

>> Dan kalau kita jalankan di web browser, otomatis jalan. Ini memungkinkan kita
untuk
mengirimkan data, bukan lagi id, karena kalau id nanti takutnya ditebak, ada
user
yang coba2 di urlnya. Cara pakainya gimana, gimana kalau kita tambahin slug di
dalam
skema database kita
>> Jadi kita tekan ctrl+p, lalu ketik post ke migrasinya, lalu kita tambahkan slug
setelah
title. Saat ini slugnya kita tulis secara manual, mungkin bisa kita lakukan
secara
automasi, tapi yang pasti kita butuh $table->string('slug') lalu kita akan
pastikan kalau
slug ini gk boleh sama satu sama lain

>> Jadi kita bisa kasih atributnya unique(); jadi ini gk boleh ada slug yang sama
Misal :
$table->string('slug')->unique();

>> Karena nanti slug akan menjadi url, sekarang karena kita sudah mengganti schema
database
kita, kita harus lakukan migrasi lagi, jangan khawatir, datanya akan hilang.
Hapus semua
data, bikin ulang

>> Kalau kita cek lagi di database, maka ada slug di database post, kita copas
kodingannya
untuk membuat data lagi. Kita ke halaman contekan kita, lalu yang kita ubah
adalah
title dan excerptnya sesuaikan sesuai datanya, lalu jangan lupa kasih slug
Misal :
Post::create([
'title' => 'Judul Pertama',
'excerpt' => 'Lorem ipsum pertama',
'slug' => 'judul-pertama',
'body' => '<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Placeat
dolores dolore nam pariatur nesciunt laboriosam, provident culpa reiciendis cumque
suscipit possimus quidem impedit incidunt dignissimos non ratione id!</p> <p>Non
explicabo id sit quibusdam assumenda illum rem porro odit tempora, rerum officiis.
Pariatur expedita sit sequi earum mollitia incidunt doloribus consequuntur quos
sint velit cupiditate quaerat quasi, ullam ducimus deleniti reprehenderit
voluptatem quod officiis quibusdam, amet asperiores?</p> <p>Eaque quia quisquam
doloremque minima voluptas, voluptate esse dolorem. Explicabo illo alias fugiat
earum libero! Optio eveniet maxime id corrupti. Molestiae saepe numquam neque.
Necessitatibus, ab sapiente. Pariatur obcaecati tempora exercitationem, enim in
iusto beatae totam laboriosam harum libero perferendis officia vero natus sapiente
adipisci distinctio eveniet quis non delectus dolore. Autem aliquam officiis
eligendi! Soluta, accusamus quas! Aliquid ab magnam porro fugiat eius minima saepe
vel sed nam eveniet pariatur, harum nesciunt neque quae quas at accusantium
aspernatur et explicabo assumenda. Illo, nam!</p>'
])

>> Lalu kita copas, kita buka terminal, ke tinker, lalu paste kan. Ini tidak akan
error
karena mass assignmentnya, lolos karena kita pakai guarded, kalau kita pakai
fillable,
kita harus nambahin slug satu lagi tadi. Selanjutnya kita bikin data kedua,
hingga ketiga

>> Jika sudah, kita cek di web browser, maka tidak akan terjadi error. Sekarang
yang kita
bikin agar yang dikirimkan itu bukan lagi id, tapi slug. Coba kita buka file
view Post,
di hrefnya, yang dikirimin adalah slug, sekarang jika kita jalankan, akan
terjadi error
>> Tapi ketika kita cek di web browsernya, arahkan kursornya ke link,
akan terlihat yang kita kirimin, itu sudah slugnya. Ketika di klik akan error
karena
dia masih nyari id. Gak ada nih post yang idnya judul-pertama. Supaya dia nyari
slug caranya
adalah

>> Kita perlu mengubah routes kita, kalau kita tulis posts/{post} aja, itu akan
ngirimin
id sebagai unique identifiernya. Tapi kalau kita tambahkan :slug, maka sekarang
slug
yang akan diquery untuk mendapatkan post yang uniquenya

>> Jadi kalau tadi dicarinya where id = berapa, sekarang yang dicari where slug
sama dengan
apa, kita gk ubah2 apapun di controller, cukup di routesnya saja kita ubah,
tidak perlu
mengubah controller
Misal :
Route::get('posts/{post:slug}', [PostController::class, 'show']);

Anda mungkin juga menyukai