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. 😊