~/saidqb cat ecosystem/framework/laravel.md
La
Laravel
PHP web application framework
commit by saidqb
Framework PHP andalan buat backend & admin panel — Eloquent ORM-nya yang paling bikin betah.
Requirements
- PHP
8.2+— cek laravel.com/docs untuk versi minimum rilis yang dipakai - Laravel
11.x(major version baru tiap tahun) - Composer
2.x
php -v && php artisan --version && composer -V
Artisan
php artisan serve
php artisan make:model Post -mcr # model + migration + controller resource
php artisan make:controller PostController
php artisan make:migration create_posts_table
php artisan make:seeder PostSeeder
php artisan make:middleware EnsureActive
php artisan migrate
php artisan migrate:rollback
php artisan migrate:fresh --seed
php artisan db:seed
php artisan tinker
php artisan route:list
php artisan queue:work
php artisan config:cache
php artisan cache:clear
Routing
Route::get('/posts', [PostController::class, 'index']);
Route::post('/posts', [PostController::class, 'store']);
Route::resource('posts', PostController::class);
Route::apiResource('posts', PostController::class); // tanpa create/edit view
Route::middleware('auth')->group(fn () => Route::resource('posts', PostController::class));
Route::prefix('admin')->name('admin.')->group(base_path('routes/admin.php'));
Eloquent — CRUD & query
Model::all();
Model::find(1);
Model::findOrFail(1); // 404 kalau tidak ada
Model::create(['key' => 'value']);
Model::firstOrCreate(['email' => $email], ['name' => $name]);
Model::updateOrCreate(['email' => $email], ['name' => $name]);
$m = Model::find(1);
$m->update(['title' => 'Baru']);
$m->delete();
Model::where('status', 'published')->get();
Model::where('foo', '=', 'bar')->first();
Model::where('foo', 'bar')->count();
Model::where('foo', 'bar')->exists();
Model::orderBy('created_at', 'desc')->paginate(20);
Model::whereIn('id', [1, 2, 3])->get();
Model::select('id', 'title')->get(); // hindari select *
Relasi & eager loading
$this->hasMany(Comment::class);
$this->belongsTo(User::class, 'user_id');
$this->belongsToMany(Tag::class);
$this->hasOne(Profile::class);
Post::with('comments', 'author')->get(); // hindari N+1
$post->load('comments'); // lazy eager load
$post->loadCount('comments'); // comments_count
Migration
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('body')->nullable();
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
$table->timestamps();
$table->softDeletes();
});
Schema::table('posts', fn (Blueprint $t) => $t->string('slug')->unique());
Validasi
$request->validate([
'title' => 'required|string|max:255',
'email' => 'required|email|unique:users',
'status' => 'in:draft,published',
]);
Validator::make($data, $rules)->validated();
Auth & Password
Auth::attempt(['email' => $email, 'password' => $password]);
Auth::user();
Auth::check();
Auth::logout();
Hash::make($password);
Hash::check($password, $hashed);
Cache & Session
Cache::remember('key', 3600, fn () => Model::all());
Cache::put('key', $value, 600);
Cache::forget('key');
session(['key' => 'value']);
session('key', 'default');
Blade
@extends('layouts.app')
@section('content')
@foreach ($posts as $post)
<h2>{{ $post->title }}</h2>
@endforeach
@if ($posts->isEmpty())
<p>Belum ada post.</p>
@endif
@endsection