Blog

Category Blog

Category Blog

Untuk menambahkan **Tag dan Categories** dalam sistem **Blog** di Laravel 11, kita akan membuat relasi **Many-to-Many** antara Blog dengan **Category** dan **Tag**.

---

## **🔹 1. Buat Model & Migration untuk Categories dan Tags**
Jalankan perintah berikut untuk membuat model dan tabel database:

```bash
php artisan make:model Category -m
php artisan make:model Tag -m
php artisan make:model BlogCategory -m
php artisan make:model BlogTag -m
```

---

## **🔹 2. Edit Migration untuk Categories & Tags**
Buka file `database/migrations/xxxx_xx_xx_create_categories_table.php` dan ubah menjadi:

```php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
public function up(): void {
Schema::create('categories', function (Blueprint $table) {
$table->id();
$table->string('name')->unique();
$table->string('slug')->unique();
$table->timestamps();
});
}

public function down(): void {
Schema::dropIfExists('categories');
}
};
```

🔹 **Lakukan hal yang sama untuk Tags**, buka `database/migrations/xxxx_xx_xx_create_tags_table.php` dan edit:

```php
return new class extends Migration {
public function up(): void {
Schema::create('tags', function (Blueprint $table) {
$table->id();
$table->string('name')->unique();
$table->string('slug')->unique();
$table->timestamps();
});
}

public function down(): void {
Schema::dropIfExists('tags');
}
};
```

---

## **🔹 3. Buat Pivot Table untuk Relasi Many-to-Many**
Karena satu blog bisa memiliki **banyak kategori & banyak tag**, kita perlu membuat **pivot table**.

Buka file `database/migrations/xxxx_xx_xx_create_blog_categories_table.php` dan edit:

```php
return new class extends Migration {
public function up(): void {
Schema::create('blog_category', function (Blueprint $table) {
$table->id();
$table->foreignId('blog_id')->constrained()->onDelete('cascade');
$table->foreignId('category_id')->constrained()->onDelete('cascade');
$table->timestamps();
});
}

public function down(): void {
Schema::dropIfExists('blog_category');
}
};
```

Lakukan hal yang sama untuk **Tags**, buka `database/migrations/xxxx_xx_xx_create_blog_tags_table.php`:

```php
return new class extends Migration {
public function up(): void {
Schema::create('blog_tag', function (Blueprint $table) {
$table->id();
$table->foreignId('blog_id')->constrained()->onDelete('cascade');
$table->foreignId('tag_id')->constrained()->onDelete('cascade');
$table->timestamps();
});
}

public function down(): void {
Schema::dropIfExists('blog_tag');
}
};
```

🔹 **Perintah `onDelete('cascade')` akan menghapus relasi jika blog dihapus.**

---

## **🔹 4. Jalankan Migrasi**
Setelah semua selesai, jalankan migrasi:

```bash
php artisan migrate
```

---

## **🔹 5. Edit Model Blog, Category, dan Tag**
### **Model `Blog.php`**
Tambahkan relasi ke Category dan Tag:

```php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Blog extends Model {
use HasFactory;

protected $fillable = ['title', 'content', 'author', 'slug', 'image'];

// Relasi Many-to-Many dengan Categories
public function categories() {
return $this->belongsToMany(Category::class, 'blog_category');
}

// Relasi Many-to-Many dengan Tags
public function tags() {
return $this->belongsToMany(Tag::class, 'blog_tag');
}
}
```

---

### **Model `Category.php`**
```php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Category extends Model {
use HasFactory;

protected $fillable = ['name', 'slug'];

public function blogs() {
return $this->belongsToMany(Blog::class, 'blog_category');
}
}
```

---

### **Model `Tag.php`**
```php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Tag extends Model {
use HasFactory;

protected $fillable = ['name', 'slug'];

public function blogs() {
return $this->belongsToMany(Blog::class, 'blog_tag');
}
}
```

---

## **🔹 6. Menyimpan Blog dengan Categories & Tags**
Misalnya kita ingin menyimpan **blog dengan kategori dan tag** dari controller:

```php
use App\Models\Blog;
use App\Models\Category;
use App\Models\Tag;

public function store(Request $request) {
$blog = Blog::create([
'title' => $request->title,
'content' => $request->content,
'author' => $request->author,
'slug' => Str::slug($request->title),
'image' => $request->file('image')->store('blog_images', 'public'),
]);

// Simpan kategori & tag
$blog->categories()->attach($request->category_ids);
$blog->tags()->attach($request->tag_ids);

return back()->with('success', 'Blog berhasil ditambahkan!');
}
```

---

## **🔹 7. Menampilkan Blog dengan Categories & Tags di Blade**
Di dalam **Blade Template**, kita bisa menampilkan **kategori dan tag** untuk setiap blog seperti ini:

```html
@foreach ($blogs as $blog)
<h2>{{ $blog->title }}</h2>
<p>{{ $blog->content }}</p>

<p><strong>Kategori:</strong>
@foreach ($blog->categories as $category)
<span class="badge bg-primary">{{ $category->name }}</span>
@endforeach
</p>

<p><strong>Tags:</strong>
@foreach ($blog->tags as $tag)
<span class="badge bg-success">{{ $tag->name }}</span>
@endforeach
</p>

<a href="{{ route('blog.view', $blog->slug) }}">Baca Selengkapnya</a>
@endforeach
```

---

## **🔹 8. Menampilkan Blog Berdasarkan Kategori**
Di **routes/web.php**, tambahkan route:

```php
Route::get('/category/{slug}', function ($slug) {
$category = Category::where('slug', $slug)->firstOrFail();
$blogs = $category->blogs()->latest()->get();

return view('blog.index', compact('category', 'blogs'));
})->name('category.view');
```

Di dalam Blade **category.blade.php**:

```html
<h1>Blog di Kategori: {{ $category->name }}</h1>

@foreach ($blogs as $blog)
<h2>{{ $blog->title }}</h2>
<p>{{ $blog->content }}</p>
<a href="{{ route('blog.view', $blog->slug) }}">Baca Selengkapnya</a>
@endforeach
```

---

## **🔹 Kesimpulan**
✅ **Menggunakan Many-to-Many untuk relasi Blog - Categories - Tags**
✅ **Kategori membantu pengelompokan besar, Tag untuk detail spesifik**
✅ **Query & Blade telah disiapkan untuk menampilkan kategori dan tag**
✅ **Blog bisa ditampilkan berdasarkan kategori**

🚀 **Sekarang Laravel 11 Anda sudah mendukung Blog dengan Categories & Tags!** Jika ada pertanyaan, beri tahu saya. 😊

0 Komentar

Berikan Komentar Anda

Get In Touch

Jl Rajawali No.44A Kec. Sukajadi , Pekanbaru, Riau

rifqi.mdev@gmail.com

085326812196

Hubungi via WhatsApp:

085326812196
Chat Sekarang