Kumpulan "trik" berbahasa indonesia untuk menggunakan framework laravel.
pull request
untuk memberikan manfaat lebih banyak !Harap perhatikan juga cara untuk berkontribusi DISINI !!
inspired by: LaravelDaily
artisan
(1 trik).⬆️ Ke Atas ➡️ Berikutnya (Perintah artisan
)
Cara mengubah format output created_at
dan updated_at
lewat model
Cara Mengubah format text created_at
dan updated_at
menjadi tgl_dibuat
dan tgl_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
created_at
dan updated_at
lewat model
Ditulis oleh: syofyanzuhad
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
.
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
Untuk created_at cukup menambahkan :
const CREATED_AT = 'tgl_dibuat';
dan untuk updated_at cukup menambahkan:
const UPDATED_AT = 'tgl_diupdate';
Ditulis oleh: syofyanzuhad
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();
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
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
.
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();
}
LocalQueryScope
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']);
artisan
⬆️ 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)
Ditulis oleh: arifwardan
composer require spatie/laravel-permission
'providers' => [
// ...
Spatie\Permission\PermissionServiceProvider::class,
];
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
php artisan optimize:clear
or
php artisan config:clear
php artisan migrate
Ditulis oleh: Ridwanhasanah
use Spatie\Permission\Models\Role;
$role = Role::create(['name' => 'writer']);
$user->assignRole($role);
$user->revokeRoleTo($role); //$role = nama rolenya apa
Ditulis oleh: Ridwanhasanah
// 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']);
// Hapus permissioin dari user
$user->revokePermissionTo('edit articles');
// Hapus dan tamabah sekaligus (update)
$user->syncPermissions(['edit articles', 'delete articles']);
$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
$user->assignRole('writer');
// Memberikan role lebih dari satu
$user->assignRole('writer', 'admin');
// alternatif lain menggunakan array
$user->assignRole(['writer', 'admin']);
$user->removeRole('writer');
// Semua role saat ini akan di hapus dari use dan di gantikan dari array yang di berikan
$user->syncRoles(['writer', 'admin']);
// 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
@can('edit articles')
//
@endcan
// atau
@if(auth()->user()->can('edit articles') && $some_other_condition)
//
@endif
// Bisa juga menggunakan @can, @cannot, @canany, dan @guest
// 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
protected $routeMiddleware = [
// ...
'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,
'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,
'role_or_permission' => \Spatie\Permission\Middlewares\RoleOrPermissionMiddleware::class,
];
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 () {
//
});
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 () {
//
});
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
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 :
.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
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'),
]) : [],
],
firstdb
, jika ingin menggunakan database ke dua ubah connection yang ada di migration, sesuai dengan nama connection di config/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();
});
}
php artisan migrate --database=mysql
php artisan migrate --database=mysql2
⬆️ Ke Atas ➡️ Berikutnya (Routing)
Ditulis oleh: Andihamsah
php artisan make:middleware Report
protected $middlewareGroups = [
'api' => [
'report' => \App\Http\Middleware\Report::class,
]
];
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:
with()
:return view('view.index')->with('users', $users)->with('posts', $posts);
view()
:return view('view.index', ['users' => $users, 'posts' => $posts]);
$data = [
'users' => $users,
'posts' => $posts
];
return view('view.index', $data);
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
// 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';
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');