laraveleloquentcrudMenengah3 mnt baca

CRUD dengan Eloquent

Operasi create, read, update, delete dengan Eloquent plus trik updateOrCreate dan soft delete.

Create: tiga cara

php
use App\Models\Post;

// 1. Mass assignment (butuh $fillable)
$post = Post::create([
    'judul' => 'Belajar Laravel',
    'slug' => 'belajar-laravel',
    'isi' => 'Isi postingan...',
    'status' => 'published',
]);

// 2. Manual lalu save()
$post = new Post;
$post->judul = 'Judul Baru';
$post->slug = 'judul-baru';
$post->isi = 'Isi...';
$post->save();

// 3. Cari dulu, buat kalau tidak ada
$post = Post::firstOrCreate(
    ['slug' => 'belajar-laravel'],
    ['judul' => 'Belajar Laravel', 'isi' => 'Isi...']
);

firstOrCreate dan updateOrCreate mencegah duplikasi data secara elegan, cocok untuk seeder dan sinkronisasi.

Update dan delete

php
$post = Post::find(1);
$post->update(['judul' => 'Judul Revisi']); // massal, hormati $fillable

Post::where('status', 'draft')->update(['status' => 'arsip']); // update massal

$post->delete();              // hapus satu
Post::destroy([1, 2, 3]);     // hapus banyak by ID

Perhatikan: update() massal lewat query builder tidak menjalankan event model (seperti updating atau observer). Kalau kamu butuh event, ambil modelnya dulu lalu update satu per satu.

Soft delete: hapus tanpa hilang

Kadang data "dihapus" harus bisa dikembalikan. Tambahkan kolom deleted_at:

bash
php artisan make:migration add_deleted_at_to_posts_table --table=posts
php
// di migration
$table->softDeletes();

// di model
use Illuminate\Database\Eloquent\SoftDeletes;

class Post extends Model
{
    use SoftDeletes;
}

Setelah itu $post->delete() hanya mengisi deleted_at, datanya tetap ada. Query normal otomatis mengecualikan data yang di-soft-delete. Untuk mengaksesnya:

php
Post::withTrashed()->get();   // termasuk yang dihapus
Post::onlyTrashed()->get();   // hanya yang dihapus
$post->restore();              // kembalikan
$post->forceDelete();          // hapus permanen

Catatan teknis: Post::where(...)->delete() massal tidak memicu event model deleting/deleted. Kalau ada observer yang membersihkan file terkait atau cache, pakai loop ->each->delete() atau ambil dulu koleksinya. Ini jebakan klasik yang bikin file yatim di storage.