0% menganggap dokumen ini bermanfaat (0 suara)
60 tayangan

Tutorial Laravel 8 pt.12 Searching & Pagination

Dokumen tersebut memberikan penjelasan tentang penambahan fitur pencarian pada blog menggunakan Laravel. Fitur pencarian akan memungkinkan pengguna mencari postingan berdasarkan keyword tertentu pada judul atau isi postingan. Komponen pencarian akan ditambahkan pada tampilan halaman posts dan hasil pencarian akan ditangkap menggunakan request untuk kemudian dilakukan filtering data postingan sesuai keyword yang dicari.

Diunggah oleh

Ryan Dhika Permana
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai TXT, PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
60 tayangan

Tutorial Laravel 8 pt.12 Searching & Pagination

Dokumen tersebut memberikan penjelasan tentang penambahan fitur pencarian pada blog menggunakan Laravel. Fitur pencarian akan memungkinkan pengguna mencari postingan berdasarkan keyword tertentu pada judul atau isi postingan. Komponen pencarian akan ditambahkan pada tampilan halaman posts dan hasil pencarian akan ditangkap menggunakan request untuk kemudian dilakukan filtering data postingan sesuai keyword yang dicari.

Diunggah oleh

Ryan Dhika Permana
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai TXT, PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 13

>> Searching ini akan kita gunakan untuk mencari postingan atau blog post,

berdasarkan key
word tertentu, nanti kita akan tentukan apakah berdasarkan judul, atau
berdasarkan tulisan
di dalam postnya

>> Pagination akan digunakan untuk membatasi postingan yang tampil di halaman
kita. Jadi kita
gk akan nampilin semua postingan sekaligus, kita akan batasi per halamannya
hanya berapa
postingan saja, sehingga nanti kita akan punya halaman 2, 3, dan seterusnya

>> Caranya, fitur pertama yang akan kita buat adalah searching atau pencarian post
berdasar
kan keyword tertentu. Nanti kita akan coba carinya berdasarkan judul atau
apapun yang
ada di dalam body tulisannya

>> Sebelum kita buat fitur searching, ada beberapa hal yang perlu diperbaiki,
yaitu pada
saat kita mengakses halaman home dan about. Kita lupa tambahin, karena kita
tidak mengirim
kan data untuk active. Yang harus kita kirimkan dari tiap controller atau
routenya

>> Jadi sekarang kita buka file web.php. Disini, kita baru kirimkan halaman posts
saja. Kalau
kita scroll ke atas, kita punya halaman about dan home yang belum dikirim, jadi
kita
tambahkan saja di bawah title. active yang berisi home dan untuk about juga
lakukan
hal yang sama
Misal :
Route::get('/', function () {
return view('home', [
"title" => "Home",
"active" => "home"
]);
});

Route::get('/about', function () {
return view('about', [
"title" => "About",
"active" => "about",
"name" => "Ryan Dhika",
"email" => "[email protected]",
"image" => "ryan.png"
]);
});

>> Jika sudah, ketika cek di web browser, maka tidak terjadi error. Sekarang kita
lanjut
masuk ke halaman blog. Ceritanya kita akan menambahkan fitur searching untuk
mencari
postingan

>> Jadi yang kita lakukan kita akan tambahkan dlu komponen input untuk melakukan
pencariannya
>> Jadi tampilan searchya ada di bawah tulisan All Post, kita bisa ketik keyword
pencariannya
lalu pencet tombol cari

>> Sekarang kita balik ke kodingan, kita akan buka halaman posts.blade . Kita akan
simpan
kodingan untuk tampilan search di h1. Nanti juga, tulisan All Postnya kita taro
di
tengah biar rapi

>> Sebelumnya, else yang sudah kita buat, penempatannya salah, jadi kita cut,
pindahkan
setelah container, supaya nanti kalau postingannya gk ada pada saat kita cari.
Tulisan
No post found yang tampil

>> Kita cari h1 dari view posts, di bawah h1 kita akan simpan pencariannya, jadi
disini
kita bikin row, containernya kita ngikut dari @section. Rownya akan ada kolom
di dalam
nya satu aja yang ukurannya kita bikin 6, yang di dalamnya ada tag form yang
actionnya
akan mengarah ke halaman posts

>> Lalu methodnya adalah get, karena get ini adalah default klo kita gk tulisin
method.
Boleh dihapus saja. Di dalam tag formnya kita tambahkan input, kita buka dari
bootstrap
di dokumentasi, di bagian component di bagian forms ada namanya input group

>> Cari yang namanya button addons. Kita butuh tampilan button kedua. Ini adalah
kolom
pencarian dan tombol pencarinya. Kita bikin supaya nempel pakai input gorup
boleh
di copas saja
Misal :
<div class="row justify-content-center">
<div class="col-md-6">
<form action="/posts">
<div class="input-group mb-3">
<input type="text" class="form-control" placeholder="Search"
name="search">
<div class="input-group-append">
<button class="btn btn-danger"
type="submit">Search</button>
</div>
</div>
</form>
</div>
</div>

>> Jika sudah, kita save, lalu balik ke browser, maka otomatis ada untuk fitur
pencariannya.
Tinggal kita bikin ke tengah, kalau ingin di taro di tengah, di rownya, kita
kasih
justify-content-center

>> Selanjutnya kita bawa juga all posts nya supaya dia di tengah dengan
menggunakan text-center
Misal :
<h1 class="mb-5 text-center">{{ $title }}</h1>

>> Lalu kita bikin supaya jaraknya tidak terlalu lebar antara title dengan fitur
search dan
di fitur searchnya justru kita tambah jaraknya ke bawah, jadi dikasih mb-3
untuk h1 dan
juga untuk fitur searchnya

>> Tinggal kita jalankan fitur pencariannya, kita cari tahu dlu, gimana cara
menangkap apa
yang kita tuliskan di tag inputnya, klo kita tulis keyword pencarian, misalnya,
pada
saat kita klik tombol search. Sebetulnya akan dikirim ke halaman posts, namenya
search
isinya apa yang kita tulis

>> Cara nangkepnya, kita bisa pakai method request. Jadi caranya, karena kita tahu
dia ngirim
ke posts, berarti kita harus arahkan dlu ke routesnya, kita punya controller.
Kita buka
file PostController, dia ngarah ke view posts

>> Coba kita tangkap dlu dengan mengetik dd(request('search')) di bawah function
index, supaya
ngambil tulisan yang kita tulis

>> Selanjutnya, kita sudah tahu bahwa dengan method request, dia ngambil
keywordnya,
selanjutnya kita tinggal query, jadi kita gk lagi melakukan query dengan
menggunakan
Post::latest()->get(), tapi kita akan pecah querynya

>> Misalnya, kita akan bikin variable baru namanya posts yang akan berisi query ke
database,
setelah itu kita gunakan kondisi, apakah ada pencarian atau tidak dengan
menggunakan if
jika kalau ada sesuatu yang ditulis di kolom pencarian, kita akan tambahkan
query ke variable
posts

>> Gunakan method where() untuk mencari postingan dimana di dalamnya ada title,
lalu kita
kasih keyword yang namanya like, kalau pencarian biasanya pakai like, lalu kita
kasih
wildcardnya, setelah like kita kasih % lalu gabungkan dengan apapun di dalam
requestnya
dan gabung lagi dengan %, supaya dia bisa mencari apapun yang ada di depan dan
apapun yang ada di belakangnya

>> Kalau menggunakan SQL biasa syntaxnya adalah : SELECT * FROM post WHERE title
LIKE %apa%
Jadi ditumpuk kalau ada searchnya, tapi klo gk ada, kita bisa langsung tulis
$posts. Jadi
querynya baru dilakukan di return view
Misal :
$posts = Post::latest();

if (request('search')) {
$posts->where( 'title' , 'like' , '%' . request('search') . '%');
}
return view('posts', [
"title" => "All Posts",
"active" => "posts",
// "posts" => Post::all(),
"posts" => $posts->get()
]);

>> Jika kita coba di web browser kita, kita coba cari judulnya sesuai dengan yang
ditampilkan
maka akan muncul hasilnya, ada satu postingan. Tapi klo gk ada yg ditulis di
kolom
search, dia akan menampilkan semua postingan

>> Tapi anehnya klo kita gunakan mesin pencarinya, setelah ketemu hasil
pencariannya, kolom
searchnya gk ada tulisan apa2, jadi agak aneh, harusnya kolom tersebut ada
tulisan
yang kita cari

>> Kita bisa tambahkan di view kita dengan menggunakan atribut value, kalau ada di
dalam
searchnya, kita ambil dengan menggunakan blade request('search'), klo gk ada,
maka nilai
nya kosong
Misal :
<input type="text" class="form-control" placeholder="Search" name="search"
value="{{ request('search') }}">

>> Jadi ketika kita cari lagi, maka tulisan yang kita cari tetap diam. Sekarang,
misalnya kita
pengen cari juga, selain dari judul, kita pengen cari dari apapun yang ada di
dalam
bodynya. Kadang2 kita pengen cari sesuatu yang kita inget kalimat atau kata2nya
tapi
isi dari tulisannya, bukan dari judulnya

>> Kita tinggal tambahkan or di dalam method where tersebut dengan menggunakan
chaining dan
method orWhere(). Jika kita ingin cari kata2nya di body, kita ketik sama
seperti title
tadi
Misal :
->orWhere('body', 'like', '%' . request('search') . '%');

>> Jadi kalau kita mau nyoba cari bagian dari body postnya di web browser, pasti
ada. Meskipun
di judul, tapi dia ada di dalam tulisannya.

>> Selanjutnya, kita akan perbaiki fungsi pencariannya, kalau misal kita lakukan
pencarian
seperti tadi, kemungkinan besar adalah tugasnya model, bukan tugasnya
controller, walaupun
tadi jalan normal

>> Tapi karena tugasnya model, jadi kita tarik ke dalam model. Tapi sebelum
dilakukan, kita
akan mencari di dokumentasi laravel yang namanya query scope.
>> Ini merupakan fitur dari eloquent agar kita bisa membuat filter kita sendiri,
kita akan
mencari bukan yang global scope, tapi yang local. Kita scroll ke bawah
keterangannya

>> Dijelaskan dengan menggunakan local scope, memungkinkan kita untuk


mendefinisikan
query2 umum, yang bisa kita gunakan kembali di dalam aplikasi kita, contohnya
klo
misalkan kita butuh untuk secara sering mengambil data user yang kita anggap
populer

>> Caranya adalah, di dalam model, kita bikin sebuah scope, jadi kita tulis method
yang
namanya scopePopular, scopenya wajib, lalu kata setelahnya bebas. Tapi di
depannya
harus ada kata scopenya buat ngasih tau bahwa dia adalah query scope di dalam
methodnya
kita tinggal tulis klausul tambahannya apa

>> Misal di depan kita udah cari, SELECT * FROM user, kalau mau cari yang populer,
kita
tinggal sisipkan WHERE, misalkan yang ngevote dia lebih dari 100. Ini persis
seperti
aplikasi kita

>> Kita cari posts di awal, semua posts, lalu nanti kita sisipkan misalnya
filternya mau apa
Misalnya kita searching, jadi namanya boleh scopeSearching, atau kita bisa
kasih namanya
agak general, kita bisa tulis scopeFilter(), karena filternya bisa banyak

>> Tinggal nanti kita return, query yang mau kita lakukan, dalam hal ini
where('like'), kalau
sudah kita pindahin ke dalam model, cara manggilnya adalah kita cek dokumentasi
laravel
scroll ke bawah ada yang namanya Utilizing a local scope

>> Kita tinggal panggil langsung methodnya di controller, klo tadi kita gunakan
method latest()
klo ini kita sisipkan dlu scopenya. jadi contoh penulisannya :
$users = User::popular()->active()->orderBy('created_at')->get();

>> Klo di contoh di atas ada 2 scope yang digunakan, yaitu popular dan active.
Jadi di query
nya ada SELECT*FROM apa WHERE yang ada di method scope popular() AND WHERE yang
ada di
method scope active()

>> Coba kita terapkan di kodingan kita, kita buka model Post. Kita bikin function
scopeFilter()
lalu dia menerima parameter si querynya. Di dalam functionnya kita isi seleksi
kondisi if
nya. Jadi kalau misalkan ada search di kolom searching, jalankan query
filter(). Ganti
variable posts dengan query
Misal :
public function scopeFilter($query)
{
if (request('search')) {
return $query->where('title', 'like', '%' . request('search') . '%')
->orWhere('body', 'like', '%' . request('search') . '%');
}
}

>> Jadi saat ada search, tambahkan return. Kita ke post controller, di return,
posts kembali
ke awal
Misal :
"posts" => Post::latest()->filter()->get()

>> Jadi gunakan model post, ambil yang latest, di tengah2 kita taro fungsi
filter() yang
kita buat di model, lalu get. Jika kita liat di web browser, misalnya kita cari
judul sembarang, maka akan mencari semua keyword yang ada di judul ataupun di
body

>> Kalau kita mau rapihin lagi, bisa, alasannya karena requestnya dilakukan di
model. Kalau
data untuk melakukan query kerjaannya model. Kalau request ini kerjaannya
controller untuk
ngecek ada request atau tidak

>> Kalau kita mau tarik ke controller, bisa juga. Jadi caranya kita cari, ada atau
tidak
variable search yang dikirim ke method scopeFilter ini. Jadi nanti kita kirim
dalam bentuk
array dengan nama variable namanya filters

>> Apapun filtersnya, nanti variable ini ingin kita pakai juga untuk pencarian
yang lebih
kompleks, untuk cari kategori ataupun author. Tapi sekarang kita mau cek
filternya dlu

>> Jadi nanti ngeceknya, bukan lagi ngecek requestnya ada atau tidak, karena itu
kerjaannya
controller. Kita akan ngecek menggunakan isset

>> Jadi kalau di dalam variable filters, ada search. Nulis isset, kita gunakan
ternary
operator, kalau ada, ambil apapun yang ada di search nya, kalau tidak ada, kita
gunakan
false, jadi gk dikerjain
Misal :
if (isset($filters['search']) ? $filters['search'] : false) {

>> Kalau gk dikerjain, artinya querynya langsung get aja, wherenya kita skip. Cara
ambil
searchnya adalah kita ke controller, kita ngirimnya ke dalam filternya, kalau
misalnya
ada request yang berisi, sekarang kita pakai array untuk isi search

>> Alasannya pakai array adalah karena kita ingin pakai untuk cari kategori dan
author nanti
nya supaya bisa langsung kita kirimkan pakai array. Kalau ada, maka akan dicek
di Model
Post
Misal :
"posts" => Post::latest()->filter(request(['search']))->get()

>> Kalau ada request dengan nama search maka kita tidak perlu lagi menggunakan
request('search') di modelnya, tapi kita gunakan $filters['search'], apapun
yang ada di
dalam keyword pencariannya
Misal :
if (isset($filters['search']) ? $filters['search'] : false) {
return $query->where('title', 'like', '%' . $filters['search'] . '%')
->orWhere('body', 'like', '%' . $filters['search'] . '%');
}

>> Kita cek di browser, maka sudah aman. Sekarang, kita akan bikin lebih efisien
lagi. Kita
sekarang akan mengganti if, menggunakan method di laravel yang namanya when()

>> Kita cek di dokumentasi laravel dengan mengetik when() ada di collection.
Penjelasannya
when method akan dijalankan ketika first argumen berisi true, jadi kita tidak
menggunakan
if, tapi kita akan lihat dari collection yang kita punya

>> Kalau bernilai true, maka kita bisa ambil collectionnya, lalu kita lakukan
sesuatu, alasan
kita melakukan ini, karena kita mau bikin ifnya banyak, jadi kita gunakan when

>> Kalau isset tadi sama dengan menggunakan method when. Sebenernya cuman
mengganti notasi
aja, fungsinya tetap sama, tapi nanti akan lebih ringkas klo kita punya banyak

>> Kita coba. Kita tulis ulang di bawahnya kita bisa tulis variable query
when()/ketika kalau
misalkan ada searchingnya, kita copas di dalam ifnya di function scopeFilter

>> Syntax tersebut sebenarnya ada yang lebih ringkas lagi, kalau kita pakai php 7,
ada yang
namanya null coalescing operator php, kita cari saja di google. Kalau kita cari
di
dokumentasinya php. Kita scroll kebawah, cari namanya null coalescing operator

>> Null coalescing operator (??), sudah ditambahin di php 7 supaya menambahkan
syntactic sugar
syntatic sugar adalah pemanis supaya kita nulisnya gampang, saat kita butuh
untuk menggunakan
ternary

>> Jadi kita tadi ternary, dan juga digunakan untuk ngecek isset. Jadi daripada
kita nulis
isset, kita tulis aja apa yang mau di cek, klo gk ada, apa yang mau
dikembailkan
Misal :
$username = $_GET['USER'] ?? 'nobody';

>> Kalau bernilai true, kita balik ke dokumentasinya, when, jika bernilai true,
kita kasih
closures atau callback, kita bisa kasih callback, kita mau jalanin apa

>> Jadi kita bisa tulis fungsi untuk jalanin, ambil querynya dlu dan kita ambil,
apa yang
ada di dalam searchnya di dalam functionnya kita return sama seperti yang
sebelumnya
tinggal kita ganti $filters['search'] jadi $search
Misal :
$query->when($filters['search'] ?? false, function ($query, $search) {
return $query->where('title', 'like', '%' . $search . '%')
->orWhere('body', 'like', '%' . $search . '%');
});

>> Jika kita cek di web browser, maka akan tidak ada error. Sekarang kalau kita
masuk ke
category atau author, artinya semua post yang ada di category yang kita ketik,
namanya
akan sama, kalau kita cari postingannya. Alangkah lebih baik kalau misalnya,
cari postingan
yang judulnya atau postingannya mengandung tulisan yang kita cari di keyword
dan dia juga
kategorinya sesuai dengan halaman kategori

>> Enaknya kan gitu, tapi kalau kita klik search, dia akan nyari ke semua
kategorinya. Solusinya
adalah kita bisa manfaatin filter kita. Kita buka controller kita. Sekarang
kita akan
ngecek jika pencariannya itu tidak hanya search, tapi ada parameter request
lain
yang ada di pencariannya

>> Kan di url, kita cuman punya search, nanti kita mau tambahin supaya bisa juga
pakai
&category=apa di urlnya

>> Sekarang kita tambahkan di requestnya category. Jadi nanti kalau ada
categorynya, nanti kita
bikin satu lagi $filters['category'], apa yang akan kita lakukan
Misal :
"posts" => Post::latest()->filter(request(['search'], ['category']))->get()

>> Sebenernya kita bisa chain function scopeFilter yang di model post, antara
$filters['search'] dan $filters['category'], dengan menggunakan when lagi,
tetapi biar
lebih gampang dibaca kita bikin variable query when() lagi seperti sebelumnya

>> Jadi kalau ada filter yang namenya adalah category maka kita jalanin function
yang ngirimin
querynya beserta categorynya. Di dalam function tersebut berisi mereturn untuk
melakukan
join table category

>> Jadi kita akan cari postingan yang sesuai dengan kriteria yang dicari, tapi dia
juga
merupakan bagian dari kategori. Laravel sudah punya sebuah method yang namanya
whereHas()
Jadi klo kita punya query, lalu kita tulis whereHas(), yang artinya dimana
query ini
punya relationship apa

>> Kita punya 2 nih relationship, jadi kalau kita manggil category itu kita
melakukan
relationship belongsTo, jadi satu kategori dimiliki 1 post. Kalau kita tulis di
whereHas
Artinya querynya punya relationship category, kita akan melakukan apa

>> Disini kita bisa melakukan callback lagi, jika kita gunakan callback
functionnya jadi
arrow function bisa juga. Yang dia menerima parameter querynya. Jadi dilanjutin
chaining
nanti kita butuh juga variable category
Misal :
$query->when($filters['category'] ?? false, function ($query, $category) {
return $query->whereHas('category', function ($query, $category) {
$query->where('slug', $category);
});
});

>> Di dalam functionnya, kita tulis variable query dimana slugnya sama dengan
category, tetapi
akan menjadi error, karena kategori sudah dideklarasikan di dalam when, tetapi
belum
dipakai, padahal sudah kita tulis di whereHas nya tetapi masih tidak digunakan

>> Jadi caegory yang ada di dalam whereHas() beda dengan category yang ada di
dalam when().
Solusinya adalah kita harus menggunakan keyword use() di dalam whereHas()
Misal :
$query->when($filters['category'] ?? false, function ($query, $category) {
return $query->whereHas('category', function ($query) use ($category) {
$query->where('slug', $category);
});
});

>> Sekarang kita udah punya querynya. Ini akan dijalankan ketika di dalam
requestnya ada
kategori. Jika kita cek di browser, sekarang yang kita punya gk ada request,
kalau mau
cari kategori yang kita punya kita pakai method di dalam controller, atau di
dalam routes

>> Jadi ketika kita arahkan kursor ke link nama kategorinya, akan mengarahkan ke
/categories/namaKategori, gk pake request, klo kita klik kategorinya itu tampil
semua
postingan yang kategorinya sesuai dengan namanya

>> Tapi kita udah punya query yang baru. Query ini tidak menggunakan query yang
baru kita buat
klo query yang kita bikin urlnya dari halaman posts itu kita kasih request
variablenya
adalah category=, penulisan urlnya jadi /posts?category=namaKategori

>> Kalau di dalam posts itu di requestnya ada category yang isinya slug dari
kategorinya,
klo kita pencet enter di urlnya, hasilnya akan sama. Tapi tulisannya all posts,
tapi semua
kategorinya sesuai dengan nilai dari category nya

>> Kerennya, klo kita udah bisa pakai merhod yang ada di model post. Kita bisa
gabungin 2
method yang ada di scopeFilter. Caranya tinggal kita kasih
"/posts?category=namaKategori&&search=keywordSearch" di urlnya

>> Klo kita enter urlnya, maka dia akan mencari postingan yang judul atau bodynya
sama dengan
keywordnya dan kategorinya sesuai dengan nama kategorinya

>> Jadi kita bisa cari berdasarkan 2 filter, karena kita pakai when. Klo kita
lihat clockwork
querynya sudah dibikinin otomatis oleh laravel. Tapi sekarang kita belum
implemen ke aplikasi
kita, kita baru implementasinya diketik di url

>> Caranya adalah kita atur di routes agar gk lagi ngelink ke category dan juga
kita harus
kirimkan data category di urlnya. Caranya kita bisa titipkan di form
pencariannya yang
ada di view posts

>> Ada 2 yang harus di perbaiki, pertama kita cari link ke category, jangan lagi
ke /categories
ganti ke /posts, tapi bukan / lagi setelahnya, melainkan ?(tanda tanya), kita
kirimkan
category=, jadi yang kita kirimkan ada disini. Begitu pula di looping
categorynya
Misal :
<a href="/posts?category={{ $posts[0]->category->name }}"
class="text-decoration-none">{{ $posts[0]->category->name }}</a>

<a href="/posts?category={{ $post->category->slug }}"


class="text-white text-decoration-none">{{ $post->category->name }}</a>

>> Jadi sekarang kalau kita klik salah satu kategorinya di browser, maka sekarang
semua
postingan sesuai dengan category. Di urlnya, kita udah gk lagi pake controller
category
tinggal memperbaiki fitur search nya

>> Caranya kita harus sisipkan di form pencariannya di bawah formnya kita gunakan
@if, kalau
di dalam request, ada category, bikin sebuah input yang tipenya hidden, yang
namenya
category yang isinya apapun yang ditulis di category tadi, kita bisa ambil di
request
category

>> Kalau ada pake, sehingga nanti di urlnya ada 2, ada search dan ada category
sekaligus.
Misal :
@if (request('category'))
<input type = "hidden" name = "category" value =
"{{ request('category') }}">
@endif

>> Sehingga nanti di urlnya ada 2, ada search dan ada category sekaligus. Ada satu
hal lagi
yang perlu kita perbaiki, klo kita masuk ke single post, ketika kursor
diarahkan ke
link kategorinya, maka dia masih ke kategori, harusnya ke post
>> Lakukan hal yang sama di view post seperti di view posts
Misal :
<a href="/posts?category={{ $post->category->slug }}"
class="text-decoration-none">{{ $post->category->name }}</a>

>> Selanjutnya kita perbaiki untuk author nya juga, sama seperti category. Di
Model Post
kita tulis
Misal :
$query->when(
$filters['author'] ?? false,
fn ($query, $author) =>
$query->whereHas(
'author',
fn ($query) =>
$query->where('username', $author)
)
);
>> Ini kalau kita mau pakai arrow function, di arrow function, kita tidak lagi
menggunakan
use, karena otomatis cari sendiri variable $author nya

>> Sekarang kita akan memperbaiki navbar untuk categories, klo kita klik menunya,
jika kita
arahkan kursor ke salah satu kategori, maka urlnya masih mengarah ke
categories, kita
akan ubah itu dengan cara

>> Kita buka view categories, lalu kita bikin hrefnya untuk ngarah ke /posts?
category=

>> Masalah yang terjadi sekarang, di Judulnya, semuanya menjadi All Post, cara
untuk
memperbaikinya adalah kita buka post controller. Kita bikin variable baru
dengan nama
title bernilai kosong

>> Setelah itu kita seleksi kondisi, jika ada category nya, kita cari kategorinya
apa,
ada gk di dalam database, gunakan firstWhere(), jadi cari kategori yang slugnya
sama
dengan request('category')

>> Kalau misalnya ada, maka di title akan berubah title akan menjadi gabungan
dari kategori
Misal :
$title = '';
if (request('category')) {
$category = Category::firstWhere('slug', request('category'));
$title = ' in ' . $category->name;
}
return view('posts', [
"title" => "All Posts" . $title,

>> Selanjutnya kita lakukan hal yang sama terhadap author


Misal :
if (request('author')) {
$author = User::firstWhere('username', request('author'));
$title = ' by ' . $author->name;
}

>> Klo kita cek di web browser, maka tidak terjadi error, sehingga klo kita
gunakan fitur
searchnya, maka tidak terjadi error. Untuk routes pada categories dan authors,
sudah
tidak terpakai, karena sudah ditangani query kita yang ada di model, jadi bisa
kita
hapus

>> Kita juga ingin bikin satu fitur yang sebetulnya bikinnya kompleks dan lama,
tapi karena
laravel memudahkannya, kita bisa bikin dengan cepat. Fitur yang namanya
pagination

>> Di dokumentasi laravel dijelaskan cara bikin pagination, jika kita cek halaman
blog,
kita mau bikin agar postingan yang ditampilin gk banyak2, misalnya, cuman 4
atau 7
postingan saja

>> Nanti di bawahnya ada link yang mengarahkan ke halaman2nya. Caranya, klo kita
lihat
di notepad php dasar, bikinnya lumayan susah.

>> Cara pakai fitur paginationnya ada di bawah di scroll saja, kita cukup panggil
method
paginate(), tadinya kita manggil get(), kita akan ganti get() dengan
paginate(), lalu
tinggal masukin mau berapa item per halaman

>> Kita ke controller kita, kita cari get(), kita ganti dengan paginate(nominal),
nominalnya
mau berapa
Misal :
"posts" => Post::latest()->filter(request(['search'], ['category'],
['author']))
->paginate(7)

>> Sekarang, jika kita cek di browser, postingan yang muncul cuman ada 2, kalau
kita ketik
di urlnya tambahkan ?page-2, ini udah halaman kedua, gimana cara nambahin
linknya,
Caranya adalah kita buka halaman posts, scroll ke paling bawah, klo kita mau
bikin
paginationnya di bawah

>> Kalau mau bikin di atas, simpen di tempat kita mau. Caranya kita ambil
querynya, kita
tinggal kasih methodnya adalah links()
Misal :
{{ $posts->links() }}

>> Jika kita cek di we browsernya, maka paginate berhasil di buat, tetapi ada anak
panah
besar sekali. Karena laravel secara default menggunakan tailwind css, kita bisa

perbaiki dengan cara kita cari di dokumentasi laravel dengan nama bootstrap
>> Ada yang namanya Using Bootstrap, cara make bootstrap, kita tinggal cari
direktori
sesuai deskripsi : App\Providers\AppServiceProvider, lalu di dalam function
boot()
tinggal tambahkan satu baris yang ada di dokumentasi laravel
Misal :
Paginator::useBootstrap();

>> Karena paginatornya tidak bisa digunakan, kita butuh namespace


use Illuminate\Pagination\Paginator; di atas file tersebut

>> Jika sudah kita cek di web browser, maka paginatornya sudah dibuat otomatis
versi
bootstrap

>> Kalau kita ingin fitur paginationnya ada di kanan, caranya kita bungkus syntax
yang
ada links() ke dalam div, kita bikin supaya div nya adalah flexbox, maka di
dalam div
tersebut akan jadi flex items.

>> Klo udah jadi flex item, kita tinggal pindahkan sesuai yang kita mau. Kalau mau
di kiri
kita tinggal tambah class justify-content-start, kalau di tengah center, kalau
di kanan
end
Misal :
<div class="d-flex justify-content-center">
{{ $posts->links() }}
</div>

>> Tapi klo kita melakukan pencarian, paginationnya, bakal gk jalan. Coba kita
klik salah
satu kategori, maka paginationnya akan ke reset semua

>> Solusinya kita tinggal tambah satu method lagi namanya withQueryString() di
post
controllernya, jadi apapun yang ada di query string sebelumnya, bawa.

>> Jika kita cek di browser, maka tidak ada masalah

Anda mungkin juga menyukai