Anda di halaman 1dari 7

>> Fitur factory akan digunakan ketika kita ingin membuat banyak data sekaligus

secara
otomatis untuk nantinya kita jadikan sebagai data di dalam seeder kita

>> Kalau sebelumnya kita menuliskan data manual di dalam seeder. Nanti kita juga
akan
menggunakan library yang namanya faker untuk membuat data kita secara otomatis
terisi dengan data palsu atau data dummy yang masuk akal secara random

>> Sehingga nanti kita tidak perlu lagi memikirkan data apa yang akan kita
masukkan sebagai
seedernya. Dengan menggunakan faker ini, kita tidak perlu lagi memikirkan isi
datanya
apa, jadi sudah di generate data palsu secara otomatis

>> Sebelum kita masuk untuk memperbaiki authornya, kita akan coba fitur yaitu
factory, atau
pabrik pembuat data, yaitu data palsu. Kalau kita membuat model dengan
menggunakan
php artisan, di dalam class nya otomatis ada use HasFactory

>> Jadi secara default kita udah bisa bikin factorynya sama seperti user, di model
user juga
ada HasFactorynya yang kalau kita tekan ctrl lalu di klik, akan masuk ke sebuah
trade
yang namanya factory, dimana disini kita bisa bikin factorynya

>> Coba kita masuk ke seeder kita, kita akan cari tahu maksud dari baris
// \App\Models\User::factory(10)->create(); untuk apa

>> Caranya kita lihat dokumentasinya, ketik di search engine factory. Konsepnya,
pada saat
pengujian, kita mungkin aja atau pasti butuh menambahkan data baru ke dalam
database kita
sebelum menjalankan tes, daripada kita secara manual mengetikkan setiap
datanya, laravel
memungkinkan kita untuk mendefinisikan sebuah factory ke dalam model kita

>> Jadi tiap model kita punya factory sendiri, untuk lihat cara kerjanya, lihat
saja direktori
database/factories/UserFactory.php, yang isinya dia adalah sebuah kelas yang
terhubung
ke class factory dimana di dalamnya ada sebuah method definition untuk bikin
data user
secara random

>> Jadi kita bikin dengan schema yang sama dengan schema yang kita bikin di model,
hanya
kita tentukan aja data2 mana aja yang kita isi. Contohnya di dokumentasi
laravel, nama
dia akan memanggil sebuah method yang namanya faker name, ini artinya generate
nama palsu pakai library faker

>> Ada juga generate email palsu yang formatnya udah bener yang dia unique pakai
library
faker. Jadi di dalam laravel sudah terintegrasi library faker, yang biasa kita
gunakan
kalau memang mau generate data dummy
>> Ini kita bisa bikin definisi kita sendiri untuk model milik kita, atau bahkan
mau ngubah
pun boleh. Kalau kita scroll ke bawah, kita bisa bikin factory kita sendiri
dengan cara
mengetikkan di terminal, php artisan make:factory PostFactory

>> Kita balik lagi ke kodingan kita, kita bikin factory untuk model post kita.

>> Jika kita lihat ada faker di dokumentasi laravel untuk factory yang berupa
link, kita
kunjungi saja terlebih dahulu websitenya, disitu ada git hubnya, tapi kita mau
masuk
ke dokumentasinya, ada di bagian kanan berupa link dengan nama
fakerphp.github.io

>> Ini sebenernya kita bisa install secara manual, kalau kita punya aplikasi yang
bukan laravel
kita bisa pakai dengan cara mengetikkan di terminal composer require
fakerphp/faker

>> Tapi kita tidak perlu lakukan hal ini karena di dalam laravel sudah ada. Yang
mau kita
lihat adalah available formattersnya, jika kita lihat, kita bisa mengenerate
banyak data
random, mulai dari gelar, nama, alamat, nomor telepon, perusahaan, dll

>> Dan nanti ini akan sesuai dengan apa yang kita butuhin, dia bisa generate
paragraf, dia
bisa generate kata2, tapi yang paling bagusnya, dia punya localsnya atau
localization,
dimana kita bisa bikin data2 yang kita punya seperti data2 di negara kita

>> Indonesia pun ada. Misalnya, kita bisa mengenerate, nomor induk kependudukan,
kita bisa
mengenerate nama orang dalam bahasa Indonesia bisa, caranya adalah, coba kita
bikin
faker berubah bahasanya jadi bahasa Indonesia

>> Caranya kita bisa ke bagian config, cari file app.php, buka file tersebut, lalu
scroll
kebawah atau kita find dengan menekan ctrl+f, kita ketikkan faker, ada yang
namanya
faker locale

>> Disini defaultnya inggris amerika, kita akan ganti jadi indonesia, tapi gk
langsung
ketik di file tersebut, kita akan bikin dia membaca file.env kita. Kita bisa
ketikkan :
'faker_locale' => env('FAKER_LOCALE','en_US'),

>> Jadi dia akan ngambil dlu yang ada di variable environment, klo gk ada
defaultnya akan
Inggris. Jika sudah kita save

>> Sekarang kita buka file .env kita, kita ketikkan di paling bawah
FAKER_LOCALE=id_ID
untuk membuatnya menjadi bahasa Indonesia

>> Setelah itu kita save, lalu kita kembali buka file DatabaseSeeder.php. Sekarang
usernya
gk akan kita create manual, jadi kita jadikan komentar

>> Kita akan bikin pakai fatory, karena yang baru ada factorynya baru user, kita
buka
komentar // \App\Models\User::factory(10)->create();

>> Hapus \App\Models, karena namespace sudah kita tulis di atas, jadi aman.
Misal :
User::factory(5)->create();

>> Coba kita bikin 5 user, walaupun nanti yang akan dipakai di blog cuman 2 user,
jika sudah
di save, kita buka terminal kita, lakukan php artisan migrate:fresh --seed

>> Jika kita cek tabel users, maka data dummy ditambahkan di tabel users. Itulah
faker, dimana
kita bisa mengenerate user secara random. Sekarang kita bikin factory kita
sendiri
untuk tabel posts

>> Caranya kita bisa menggunakan artisan atau bisa juga menggunakan pallete dengan
menekan
ctrl+shift+p cari artisan: Make Factory. Kalau dengan artisan kita ketik di
terminal
php artisan make:factory PostFactory(nama factory kita), nama factory ditulis
seperti itu
supaya sama dengan nama modelnya

>> Jika sudah tekan enter, lalu faker sudah dibuat, bahkan nanti kedepannya kalau
kita sudah
paham factory, migrasi, seeder. Pada saat kita bikin model di terminal,
misalnya kita
biasa bikin model php artisan make:model NamaModel, kita bisa menambahkan flag,
kalau mau
bikin migrasi, tambahkan -m, kalau mau bikin factorynya, tambahin f, kalau mau
bikin seeder
nya tambahin s
Misal : php artisan make:model Student -mfs

>> Jadi nanti otomatis akan dibikinin juga selain file model student, akan dibikin
file migrasi
file factory dan file seeder dan namanya sudah benar semua

>> Kita buka file PostFactory, di dalamnya ada juga method definition, disini kita
akan bikin
factorynya. Jadi kita akan melakukan apa yang ada di dalam seeder untuk post
Misal :
public function definition()
{
return [
'title'=> $this->faker->name()
];
}

>> Tetapi bukan name yang akan kita pakai, kita akan lihat ke web
fakerphp.github.io, kita
ke formatters, lalu kita butuh text, ada yang namanya sentence yang digunakan
untuk
membuat kalimat, jadi akan dibikinin kalimat random yang nanti kita bisa atur
panjangnya
berapa, kalau dikosongkan, nanti katanya akan default 6
Misal :
public function definition()
{
return [
'title'=> $this->faker->sentence()
];
}

>> Kalau kita mau jumlah kalimatnya acak atau random, laravel punya method yang
namanya
mt_rand() untuk membangkitkan bilangan random, kita bisa masukin minimalnya
berapa dan
maksimal mau berapa
Misal :
public function definition()
{
return [
'title'=> $this->faker->sentence(mt_rand(2,8))
];
}

>> Selanjutnya kita butuh slug. Si faker juga memiliki slug, kita bisa contek ke
webnya,
ketikkan slug di search engine, lalu kita tuliskan lagi di bawah title untuk
slug, walaupun
nanti slugnya gk nyambung sama faker, gpp

>> Selanjutnya ada excerpt, kita gunakan paragraph(), lalu body kita bisa
gunakan paragraph() juga dengan mt_rand() antara 5 sampai 10 paragraf, lalu,
kita butuh
category_id dan user_di

>> Kalau untuk foreign key ini kita bisa tuliskan pastinya user dengan id 1 dan
kategori 1,
kita anggap gitu dlu
Misal :
public function definition()
{
return [
'title' => $this->faker->sentence(mt_rand(2, 8)),
'slug' => $this->faker->slug(),
'excerpt' => $this->faker->paragraph(),
'body' => $this->faker->paragraph(5, 10),
'user_id' => 1,
'category_id' => 1
];
}

>> Jika sudah kita save dlu, buka DatabaseSeedernya, kita komentari untuk membuat
data
di model Post. Lalu kita bikin post menggunakan factory
Misal :
Post::factory(20)->create();

>> Jika sudah kita migrate ulang. Jika kita cek di web browser, maka tulisannya
akan menjadi
banyak sekali. Jika kita lihat, usernya cuman 1 orang doang dan kategorinya
juga cuman
ada 1, padahal database usernya ada banyak. Kita bisa bikin math random,
tetapi, karena
kurang bisa dinamis, karena jumlah usernya tidak diketahui ada berapa

>> Kalau di kasus kita, kita bikin usernya random dengan min dan maks masing2 1
dan 3, dan
categorynya cuman ada 2, kita bisa kasih mt_rand(1,2), kita harus sesuaikan,
user yang
dibikin ada 3 dan kategorinya ada 2 di DatabaseSeedernya
Misal : di PostFactory :

'user_id' => mt_rand(1,3),


'category_id' => mt_rand(1,2)

di DatabaseSeeder :
User::factory(3)->create();

>> 20 postingan baru ini akan mengambil random dari 3 user dan akan ngambil random
dari 2
kategori yang sudah dibuat, kita lakukan migrasi ulang. Jika kita lihat
postingannya,
kategori dan usernya sudah random

>> Sekarang kita bisa bikin supaya data yang tampil itu data yang terbaru duluan.
Caranya
adalah kita bisa ke controller post kita, kita bisa ganti all() dengan latest()
Misal :
public function index()
{
return view('posts', [
"title" => "Posts",
"posts" => Post::all(),
"posts" => Post::latest()->get()
]);
}

>> Kalau kita jalanin, tidak ada perubahan, karena postingan ini semua dibikin di
waktu yang
sama, dia akan ngeliat created_at nya semuanya sama persis di detik yang sama.
Kalau kita
bikin postingan baru pakai seeder, tetapi kita tidak jalanin semua

>> Kita komentari seeder category dan usernya, kita ubah post factorynya untuk
membuat 5
postingan baru, kalau mau jalanin ini aja kita tinggal ketik di terminal php
artisan
db:seed

>> Sekarang kita akan menjalankan, ketika kita klik nama usernya maka akan muncul
daftar
postingan yang dibuat oleh user tersebut. Caranya sama dengan ketika kita bikin
category

>> Kita bikin routesnya sama seperti category, kita tinggal bikin route baru
dengan get lalu kita
arahkan ke halaman authors, lalu kita akan ngambil data user, lalu kita bikin
fuction atau closures, di dalamnya kita copas milik categories
>> Kita bisa pinjem punyanya posts, ini di dalam function kita beri route model
binding
mengarah ke User dengan variable $user. title diganti jadi User Posts,
$category diganti
jadi user->posts
Misal :
Route::get('authors/{user}', function (User $user) {
return view('posts', [
'title' => 'User Posts',
'posts' => $user->posts
]);
});

>> Kita panggil modelnya dengan cara membuat use App\Models\User; di bawah model
Category di
paling atas
Misal :
use App\Models\User;

>> Kita buka halaman posts view, kita ganti hrefnya dengan /authors/{{$post->user-
>id}}. Jika
sudah kita save, kembali ke web browser lalu refresh, ketika kita klik namanya,
maka yang
tampil di semua halaman ini hanya tulisannya user tersebut
Misal :
<p>By.<a href="/authors/{{$post->user->id}}" class="text-decoration-none">
{{ $post->user->name }}</a> in <a href="/categories/{{ $post->category-
>slug }}"
class="text-decoration-none">{{ $post->category->name }}</a></p>

>> Kalau kita lihat di urlnya, itu masih berupa id, kalau kita lihat jadi kurang
bagus. Solusi
nya kita cari field yang lain yang representatif, kalau kita lihat di migrasi
users. Kita
tidak bisa pakai name, karena di name itu tidak unique, sedangkan untuk route
model
binding, sebaiknya unique

>> Gimana kalau kita bikin struktur baru, kita tambahkan satu field lagi dengan
nama username
Misal :
$table->string('username')->unique();

>> Selanjutnya jangan lupa sebelum kita migrasi, kita perbaikin factorynya, kita
buka UserFactory
kita duplikat baris syntax name, lalu kita ubah username, faker juga punya
username.
Jangan lupa diberi unique
Misal :
'username' => $this->faker->unique()->username(),

>> Jika sudah, baru kita buat seedernya, kita bikin 20 postingan lagi, kategori
dan usernya
kita nyalakan lagi dengan membuka komentar. Selanjutnya kita lakukan migrate
fresh lagi

>> Jika kita cek di browser, tidak terjadi error, tetapi di urlnya masi id, kita
benerin
supaya ngirimnya bukan id, perbaikin di routesnya dan juga di postsnya
Misal : di routes :
Route::get('authors/{user:username}', function (User $user) {

di view posts :
<p>By.<a href="/authors/{{ $post->user->username }}"

>> Kita bakalan benerin di routesnya kita pikirin agar kita gk pakai user,
walaupun betul
model yang kita gunakan adalah user, tapi konteksnya sekarang lagi ngomongin
author,
sebaiknya kita ganti menjadi author
Misal :
Route::get('authors/{author:username}', function (User $author) {
return view('posts', [
'title' => 'User Posts',
'posts' => $author->posts
]);

>> Jika sudah kita perbaikin yang view postsnya, kita tulis hrefnya :
Misal : <a href="/authors/{{ $post->user->username }}"

>> Jika di cek di web browser aman, tetapi, klo kita lihat di view posts hrefnya
kita tetap
panggil user, jadi konteksnya tidak sesuai, kalau kita mau ubah user jadi
author juga,
kita harus buka model post kita

>> Di model ini , kita manggil user, jadi di halaman posts manggil user, dia tu
sebenarnya
manggil method user yang ada di Model Post. Kalau kita ganti jadi author, akan
error.
Karena nanti laravelnya akan ngecek ada gk di tabel posts, field yang namanya
author_id
sebagai foreign key nya, adanya user_id

>> Kalau kita mau mengganti jadi author kita tambahkan parameternya user_id
Misal:
public function author()
{
return $this->belongsTo(User::class, 'user_id');
}

>> Jadi artinya kita akan ganti aliasnya user_id menjadi author, setelah itu kita
ganti
href di posts dan di post $post->user->username jadi $post->author->username

Anda mungkin juga menyukai