Logo

~/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