Kumpulan "trik" berbahasa indonesia untuk menggunakan framework laravel.
Kirimkan pull request
untuk memberikan manfaat lebih banyak !
Harap perhatikan juga cara untuk berkontribusi DISINI !!
inspired by: LaravelDaily
- DB Models dan Eloquent (8 trik).
- Perintah
artisan
(1 trik). - Package (6 trik).
- Templating (1 trik).
- Basis Data (Database) (1 trik).
- Middleware(1 trik).
- Routing (2 trik).
- Tampilan (View) (1 trik).
- Lain - lain (1 trik).
⬆️ Ke Atas ➡️ Berikutnya (Perintah artisan
)
-
Cara mengubah format output
created_at
danupdated_at
lewat model -
Cara Mengubah format text
created_at
danupdated_at
menjaditgl_dibuat
dantgl_diupdate
lewat model -
Cara otomatis mengisi kolom created_at dan updated_at pada tabel pivot
-
Cara membuat
fillable
di seluruh fieldnya pada model dengan mudah
Ditulis oleh: syofyanzuhad
- created_at
Untuk mengubah format created_at
, tambahkan method berikut di dalam model:
public function getCreatedAtFormattedAttribute()
{
return $this->created_at->format('H:i d, M Y');
}
Method ini bisa digunakan dengan cara seperti ini : $entry->created_at_formatted
.
Dan akan menampilkan hasil seperti ini: 04:19 23, Aug 2020
.
- updated_at
Untuk mengubah format updated_at
, tambahkan method berikut di dalam model:
public function getUpdatedAtFormattedAttribute()
{
return $this->updated_at->format('H:i d, M Y');
}
Method ini bisa digunakan dengan cara seperti ini : $entry->updated_at_formatted
.
Dan akan menampilkan hasil seperti ini: 04:19 23, Aug 2020
.
Ditulis oleh: aldyrifaldi
Caranya sangat mudah
- created_at
Untuk created_at cukup menambahkan :
const CREATED_AT = 'tgl_dibuat';
- updated_at
dan untuk updated_at cukup menambahkan:
const UPDATED_AT = 'tgl_diupdate';
Ditulis oleh: syofyanzuhad
- where
Misalnya kita punya table users
dengan kolom id
, nama
dan kita mau menampilkan data users
yang id
nya 1, biasanya kita menuliskannya seperti ini:
$users = User::where('id', 1)->get();
atau kita mau menampilkan data berdasarkan nama
:
$users = User::where('nama', 'namauser')->get();
dan kita juga bisa menampilkan data berdasarkan id
dan nama
:
$users = User::where(['id'=> 1, 'nama' => 'namauser'])->get();
- whereKolom
Sebenarnya kita juga bisa menuliskannya seperti ini:
$users = User::whereId(1)->get();
atau:
$users = User::whereNama('namauser')->get();
dan:
$users = User::whereIdAndNama(1, 'namauser')->get();
Ditulis oleh: zulmarij
- whereIn
Sintaks whereIn
:
whereIn(Coulumn_name, Array);
Contoh Penggunaan whereIn
User::whereIn('id', [1, 2, 3])->get();
permintaan di atas mencari id
yang valuenya 1
,2
,dan 3
.
- whereNotIn
Sintaks whereNotIn
:
whereNotIn(Coulumn_name, Array);
Contoh Penggunaan whereNotIn
User::whereNotIn('id', [1, 2, 3])->get();
permintaan di atas mencari id
yang valuenya bukan 1
,2
,dan 3
.
Ditulis oleh: syofyanzuhad
Sebelumnya, jika kita ingin mengisi tabel pivot. Kita bisa menggunakan method sync()
seperti contoh dibawah ini:
public function store() {
...
$user->roles()->sync([1, 2, 3]);
...
}
dengan cara diatas, hanya akan mengisi kolom user_id
dan role_id
pada tabel role_user
. Jika kita ingin menggunakan created_at
dan updated_at
pada tabel pivotnya yaitu role_user
, maka kita perlu menambahkan method ->withTimestamps()
pada relasi model User.php
seperti di bawah ini:
public function role()
{
return $this->belongsToMany(Role::class)->withTimestamps();
}
Ditulis oleh: Lucky7Tb
Misal anda mempunyai model User
lalu anda ingin mengambil data user dengan role 'admin' atau 'member'. Kita bisa saja menulis seperti ini
User::where('role', 'admin')->get();
User::where('role', 'member')->get();
Dengan QueryScope, penulisan where diatas akan lebih mudah dibaca oleh kita sebagai developer.
Pada model User, tambahkan fungsi seperti ini:
public function scopeIsAdmin($query) {
return $query->where('role', 'admin');
}
public function scopeIsMember($query) {
return $query->where('role', 'member');
}
Kita membuat fungsi diatas harus dengan prefix (awalan) "scope" lalu sisanya kita beri nama fungsi bebas dengan format sisanya 'PascalCase'
Lalu kita tinggal panggil seperti ini
User::isAdmin()->get();
User::isMember()->get();
Perlu diingat untuk pemanggilan fungsinya menggunaka format 'camelCase'.
Atau lebih kerennya kita bisa membuat queryscopenya dinamis.
public function scopeRole($query, $role) {
return $query->where('role', $role);
}
// Pemanggilan
User::role('admin')->get();
// Atau
User::role('member')->get();
Ditulis oleh: aprian1337
Seperti kita tau, jika kita ingin menambahkan data baru menggunakan create
di eloquent, kita harus mendeklarasikan terlebih dahulu field apa saja yang dapat diisi data pada array $fillable
di modelnya. Jika kita ingin menambahkan property fillable
ke model, kita dapat menambahkan field dari table kita ke dalam array fillable di modelnya, seperti berikut:
protected $fillable = [
'nama', 'email', 'password', 'alamat', 'hobi'
];
Sebenarnya tidak ada masalah terhadap kode di atas, namun jika field dari tabelnya banyak dan kita memiliki kebutuhan untuk fieldnya dapat diisi semua, maka kita harus memasukkan seluruh fieldnya ke dalam array $fillable
dan itu membuat kode menjadi banyak dan tentunya tidak efektif, karena apa? Jika kita menambahkan field baru, kita harus menambahkan field baru tersebut ke dalam array $fillable
lagi.
Jadi untuk memangkas kode tersebut, kita dapat memanfaatkan fitur $guarded
pada model. Singkatnya $guarded
ini memiliki fungsi kebalikan dari $fillable
, jika $fillable
adalah list dari field yang dapat diisi data, $guarded
ini adalah list field yang tidak boleh diisi data. Jadi simplenya kita tinggal menggunakan fitur dari $guarded
ini lalu mengisinya dengan array kosong, yang artinya kita memberikan akses untuk seluruh masukan data ke dalam field dari model.
Untuk kodenya seperti di bawah ini :
protected $guarded = [];
Ditulis oleh: Muh-Sidik
Oke bagaimana cara select dengan eloquent?
Misalnya, kita mempunyai 30 column pada pada 1 table lalu yang kita ingin tampilkan hanya 5 column saja.
Nah, pemborosan sekali jika kita hanya ingin menampilkan 5 column tapi 30 column nya ter-select, maka ini membuat performa database tidak baik malah jenderung membebani, apalagi jika datanya sudah banyak.
Ada caranya nih kalo di Eloquent, contohnya kita hanya ingin memampilkan 2 column dari Model User
:
Yaitu jika menggunakan fungsi get()
:
User::get(['name', 'email']);
Bisa juga menggunakan fungsi select()
:
User::select(['name', 'email'])->get();
Maka, dua cara diatas hanya akan menampilkan 2 column dari table/model user yaitu colum name
dan email
.
Oh ya, cara dengan fungsi get()
bisa juga diterapkan pada fungsi all()
User::all(['name', 'email']);
⬆️ Ke Atas ➡️ Berikutnya (Package)
Ditulis oleh: syofyanzuhad
Untuk membuat model
, controller
,migration
, factory
, dan seeder
sekaligus cukup jalankan perintah untuk membuat model dengan tambahan -mcfs
, seperti berikut :
php artisan make:model User -mcfs
Jika kita ingin membuat controller
dengan resource (default method dari laravel). Gunakan perintah ini (dengan tambahan huruf r
):
php artisan make:model User -mcrfs
Atau di laravel versi 8 kita bisa menyingkatnya dengan flag -a
(yang berarti all). Maka kita akan membuat semuanya (model
, controller
,migration
, factory
, dan seeder
) sekaligus, dengan perintah yang sangat singkat, seperti di bawah ini :
php artisan make:model User -a
⬆️ Ke Atas ➡️ Berikutnya (Templating)
- Install Spatie Role Permission
- Cara Menggunakan Role
- Cara Menggunakan Permission
- Cara Menggunakan Permission Via Role
- Cara Menggunakan Spatie di Blade
- Cara Menggunakan Spatie di Middleware
Ditulis oleh: arifwardan
- Install package
composer require spatie/laravel-permission
- edit app/config.php
'providers' => [
// ...
Spatie\Permission\PermissionServiceProvider::class,
];
- publish migration di terminal
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
- clear config & cache
php artisan optimize:clear
or
php artisan config:clear
- terakhir jalankan migration
php artisan migrate
Ditulis oleh: Ridwanhasanah
- membuat role
use Spatie\Permission\Models\Role;
$role = Role::create(['name' => 'writer']);
- Menambahkan role kepada user
$user->assignRole($role);
- Menghapus role pada user
$user->revokeRoleTo($role); //$role = nama rolenya apa
Ditulis oleh: Ridwanhasanah
- Menambahkan Permission
// Tambah permission ke user
$user->givePermissionTo('edit articles');
// Tambah permission melalui role
$user->assignRole('writer');
$role->givePermissionTo('edit articles');
// Tambahkan role sekaligus
$user->givePermissionTo('edit articles', 'delete articles');
// Tambahkan role sekaligus menggunakan array
$user->givePermissionTo(['edit articles', 'delete articles']);
- Menghapus Permission
// Hapus permissioin dari user
$user->revokePermissionTo('edit articles');
// Hapus dan tamabah sekaligus (update)
$user->syncPermissions(['edit articles', 'delete articles']);
- Mengecek Apakah User Mempunyai Permissioin
$user->hasPermissionTo('edit articles');
// Cek use mengguakan id
$user->hasPermissionTo('1');
$user->hasPermissionTo(Permission::find(1)->id);
$user->hasPermissionTo($somePermission->id);
// Periksa user yang mempunya beberapa permission
$user->hasAnyPermission(['edit articles', 'publish articles', 'unpublish articles']);
// alterntif lain
$user->hasAllPermissions(['edit articles', 'publish articles', 'unpublish articles']);
// Periksa user yang mempunya beberapa permission menggunakan integer
$user->hasAnyPermission(['edit articles', 1, 5]);
Ditulis oleh: Ridwanhasanah
- Menerapkan Role ke User manapun
$user->assignRole('writer');
// Memberikan role lebih dari satu
$user->assignRole('writer', 'admin');
// alternatif lain menggunakan array
$user->assignRole(['writer', 'admin']);
- Menghapus Role dari User
$user->removeRole('writer');
- Update Role dari User
// Semua role saat ini akan di hapus dari use dan di gantikan dari array yang di berikan
$user->syncRoles(['writer', 'admin']);
- Memeriksa User mempunyai Role, biasanya di gunakan untuk validasi
// Semua role saat ini akan di hapus dari use dan di gantikan dari array yang di berikan
$user->syncRoles(['writer', 'admin']);
// Memeriksa user yang mempunyai beberapa role
$user->hasAnyRole(['writer', 'reader']);
// atau
$user->hasAnyRole('writer', 'reader');
// Cek jika user punya semua role
$user->hasAllRoles(Role::all());
Ditulis oleh: Ridwanhasanah
- Permission pada Blade
@can('edit articles')
//
@endcan
// atau
@if(auth()->user()->can('edit articles') && $some_other_condition)
//
@endif
// Bisa juga menggunakan @can, @cannot, @canany, dan @guest
- Role pada Blade
// Persiksa sebuah role
@role('writer')
Saya seorang penulis!
@else
Saya bukan penulis
@endrole
// bisa juga menggunakan ini
@hasrole('writer')
Saya seorang penulis!
@else
Saya bukan penulis
@endhasrole
// Cek beberapa Role
@hasanyrole($collectionOfRoles)
Saya punya satu atau lebih dari satu role
@else
Saya tidak punya role...
@endhasanyrole
// atau
@hasanyrole('writer|admin')
Saya penulis atau admin atau keudannya!
@else
Saya tidak punya role...
@endhasanyrole
// Cek Semua Role
@hasallroles($collectionOfRoles)
Saya punya semua role!!
@else
Saya tidak memiliki semua role...
@endhasallroles
// atau
@hasallroles('writer|admin')
Saya penulis dan juga admin!!
@else
Saya tidak memiliki semua role...
@endhasallroles
// Alternatif lain, @unlessrole
@unlessrole('does not have this role')
Saya tidak punya role
@else
Saya punya role
@endunlessrole
Ditulis oleh: Ridwanhasanah
- Tambahkan Kodingan di bawah ini pada app/Http/Kernel.php
protected $routeMiddleware = [
// ...
'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,
'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,
'role_or_permission' => \Spatie\Permission\Middlewares\RoleOrPermissionMiddleware::class,
];
- Cara memvalidasi Route
Route::group(['middleware' => ['role:super-admin']], function () {
//
});
Route::group(['middleware' => ['permission:publish articles']], function () {
//
});
Route::group(['middleware' => ['role:super-admin','permission:publish articles']], function () {
//
});
Route::group(['middleware' => ['role_or_permission:super-admin|edit articles']], function () {
//
});
Route::group(['middleware' => ['role_or_permission:publish articles']], function () {
//
});
- Memvalidasi Route lebih dari satu role atau permission menggunakan | (pipa) karakter
Route::group(['middleware' => ['role:super-admin|writer']], function () {
//
});
Route::group(['middleware' => ['permission:publish articles|edit articles']], function () {
//
});
Route::group(['middleware' => ['role_or_permission:super-admin|edit articles']], function () {
//
});
- Memvalidasi Middleware di Controller
public function __construct()
{
$this->middleware(['role:super-admin','permission:publish articles|edit articles']);
}
public function __construct()
{
$this->middleware(['role_or_permission:super-admin|edit articles']);
}
⬆️ Ke Atas ➡️ Berikutnya (Basis Data / Database)
Ditulis oleh: arifwardan
- Sebuah fungsi untuk mengubah string html menjadi string pdf menggunakan wkhtmltopdf. Fungsi ini tidak menggunakan file sementara apa pun dan tidak bergantung pada plugin. untuk info update silahkan lihat meertensm/HtmlToPdf
function toPdf($html, $landscape = false)
{
$wkhtmltopdf = '/usr/local/bin/wkhtmltopdf';
// manfaatkan variables laravel's environment
// $wkhtmltopdf = env('WKHTMLTOPDF');
$descriptorspec = [
0 => ['pipe', 'r'], // stdin
1 => ['pipe', 'w'], // stdout
2 => ['pipe', 'w'] // stderr
];
//Hapus DYLD_LIBRARY_PAth sebagai solusi errors ketika bekerja di system operasi MAC menggunakan MAMP
$process = proc_open('unset DYLD_LIBRARY_PATH ;' . $wkhtmltopdf . ' ' . ( $landscape ? '-O landscape' : '' ) . ' -q - -', $descriptorspec, $pipes);
// kirim HTML di stdin
fwrite($pipes[0], $html);
fclose($pipes[0]);
// Baca hasilnya
$pdf = stream_get_contents($pipes[1]);
$errors = stream_get_contents($pipes[2]);
// Tutup Prosesnya
fclose($pipes[1]);
$return_value = proc_close($process);
if ($errors){
dd($errors);
}else{
header('Content-Type: application/pdf');
echo $pdf;
}
}
Ke Atas ➡️ Berikutnya (Middleware)
Ditulis oleh: arifwardan
-
biasa di gunakan untuk aplikasi menengah ke atas
-
cara pemasangan :
- Tambahkan baris kode ini, di dalam file
.env
.
DB_CONNECTION2=mysql2
DB_HOST2=127.0.0.1
DB_PORT2=3306
DB_DATABASE2=database ke 2
DB_USERNAME2=root
DB_PASSWORD2=password kamu
- Di dalam file
config/database.php
tambahkan baris kode berikut:
'mysql2' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST2', '127.0.0.1'),
'port' => env('DB_PORT2', '3306'),
'database' => env('DB_DATABASE2', 'forge'),
'username' => env('DB_USERNAME2', 'forge'),
'password' => env('DB_PASSWORD2', ''),
'unix_socket' => env('DB_SOCKET2', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
- Untuk default databasenya adalah
firstdb
, jika ingin menggunakan database ke dua ubah connection yang ada di migration, sesuai dengan nama connection diconfig/database.php
public function up()
{
Schema::connection('mysql2')->create('users', function (Blueprint $table) { // <= perhatikan connection nya
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
- Jalankan migration satu persatu
php artisan migrate --database=mysql
php artisan migrate --database=mysql2
- selesai
⬆️ Ke Atas ➡️ Berikutnya (Routing)
Ditulis oleh: Andihamsah
- Membuat class middleware menggunakan artisan
php artisan make:middleware Report
- Tambahkan Class middleware tadi ke dalam middlewareGroups yang ada di kernel.php
protected $middlewareGroups = [
'api' => [
'report' => \App\Http\Middleware\Report::class,
]
];
- Masuk Ke Web.php. dan Tambahkan Route middleware Group
Route::middleware('report', 'throttle:1,1440')->group(function () {
Route::post('laporan', "Dashboard\ReportController@store")->name('laporan');
});
//'report' -> nama middleware yg sudah terdaftar di kernel
//'throttle' -> library untuk Rate Limit
//'1,1440' -> 1 kali validasi dalam 24 jam/1440 menit
Cara Merubah pesan error throttle
Masuk ke Exceptions/Handler.php
, masukkan kondisi di dalam function render.
Contoh:
if ($exception instanceof ThrottleRequestsException) {
return response()->json(abort(429, 'Upaya Hari Ini Sudah Habis'));
}else {
return parent::render($request, $exception);
}
⬆️ Ke Atas ➡️ Berikutnya (Tampilan / view)
Ditulis oleh: hanifazzuhdi
Untuk mencari data berdasarkan id / kolom lain pada suatu table kita bisa menggunakan route model binding yang disediakan laravel. Misalnya :
//Route
Route::get('book/{book}', 'BookController@show');
//Controller
class BookController {
public function show (Book $book){
return $book;
}
}
Kode diatas akan menampilkan data buku sesuai dengan id yang dituliskan sebagai parameternya.
Kita juga bisa mencari data berdasarkan kolom yang lain misalnya kolom slug dengan mengubah route menjadi :
// Route => tambahkan {:nama_kolom} setelah nama model book
Route::get('book/{book:slug}', 'BookController@show');
// Controller => akan menampilkan data berdasarkan slugnya tanpa query where
class BookController {
public function show (Book $book){
return $book;
}
}
Cara ini akan mempersingkat kode dibandingkan harus melakukan query where terlebih dahulu sebelum menampilkan data.
Ditulis oleh: mbaharuddinyusuf
untuk mengelompokkan route berdasarkan controller yang sama.
Biasanya kita menulis :
Route::get('/index',[AdminController,'index']);
Route::get('/show',[AdminController,'show']);
Route::get('/edit',[AdminController,'edit']);
Akan lebih rapi dan cepat, jika :
Route::controller(AdminController::class)->group(function(){
Route::get('/index','index');
Route::get('/show','show');
Route::get('/edit','edit');
}
⬆️ Ke Atas ➡️ Berikutnya (Lain -lain)
Ditulis oleh: Muh-Sidik
Ada beberapa cara untuk mengolah variabel ke view yang akan kita render untuk front-end
, yaitu:
- Menggunakan fungsi
with()
:
return view('view.index')->with('users', $users)->with('posts', $posts);
- Dengan array dan langsung include ke parameter kedua di fungsi
view()
:
return view('view.index', ['users' => $users, 'posts' => $posts]);
- Atau dengan variabel dengan tipe array:
$data = [
'users' => $users,
'posts' => $posts
];
return view('view.index', $data);
- Terakhir dengan cara yang paling banyak di pakai yaitu dengan fungsi
compact()
:
$users = User::get();
$posts = Post::get();
return view('view.index', compact('users', 'posts'))
Note: untuk fungsi compact()
dapat dipelajari disini
⬆️ Ke Atas
Ditulis oleh: aldyrifaldi
- if-else
// ternary operators (?:) atau istilah lainnya shorthand if/else.
// bisa digambarkan if = ?, dan else = :
// contoh:
$nilaiUjian = 9;
// menggunakan if-else
if ($nilaiUjian > 6) {
echo 'Baik'
} else {
echo 'Kurang'
}
// menggunakan ternary
echo $nilaiUjian > 6 ? 'Baik' : 'Kurang'; // Baik
// Contoh lain penulisan singkat if-else:
$role = 0;
echo $role == 0 ? 'Admin' : 'Pengunjung';
- if-elseif-else
Hindari penulisan seperti ini:
$role = 0;
echo $role == 0 ? 'admin' : $role == 1 ? 'guru' : 'santri';
Jika mengikuti penulisan di atas maka akan muncul pesan error
Unparenthesized a ? b : c ? d : e is deprecated. Use either (a ? b : c) ? d : e or a ? b : (c ? d : e)
Yang benar adalah seperti ini:
$role = 0;
echo $role == 0 ? 'admin' : ($role == 1 ? 'guru' : 'santri');