Reputation: 33
I want to create a blog where when I wreate a post a post can have 2 or more categories. I succed to do that with ONE category.
Posts.php :
<?php
namespace App\Models;
use App\Events\PostDeletedEvent;
use App\Events\PostUpdatedEvent;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use App\Models\Category;
class Post extends Model
{
use HasFactory;
protected $dispatchesEvents = [
'deleted' => PostDeletedEvent::class,
'updated' => PostUpdatedEvent::class,
];
protected $fillable = [
'title',
'content',
'slug',
'user_id'
];
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
public function categories(): BelongsToMany
{
return $this->belongsToMany(Category::class);
}
public function getRouteKeyName(): string
{
return 'slug';
}
}
**category.php : **
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use App\Models\Post;
use Illuminate\Database\Eloquent\Relations\HasMany;
class Category extends Model
{
use HasFactory;
protected $fillable = [
'name'
];
public function posts(): HasMany
{
return $this->hasMany(Post::class);
}
}
Models and relation
I have already set up two tables has many-to-many relation and these tables are intermediated by pivot table called category_post.And on my show view I can see when a post have two catagories
I don't know how to do my foreach to insert multiple categories into my posts
my controller :
public function store(PostRequest $request): RedirectResponse
{
$post = Post::query()->create($request->validated());
$post->categories()->attach($request->category);
and my blade page :
<form action="{{ $post->exists ? route('posts.update', $post) : route('posts.store') }}" method="post">
@csrf
@method($post->exists ? 'put' : 'post')
<div>
<x-label for="title" :value="__('Title')" />
<x-input id="title" class="block mt-1 w-full" type="text" name="title" :value="old('title', $post->title)" autofocus />
</div>
<div>
<x-label for="content" :value="__('Content')" />
<x-input id="content" class="block mt-1 w-full" type="text" name="content" :value="old('content', $post->content)" />
</div>
<div>
<x-label for="category" :value="__('Categories')"></x-label>
<select name="category" id="category">
<option value="">- - Select a category - -</option>
@foreach ($categories as $category)
<option value="{{$category->id}}">{{$category->name}}</option>
<?php // <option value="{{$category->id}}">{{$category->name}}</option>?>
@endforeach
</select>
<select name="category" id="category">
<option value="">- - Select a category - -</option>
@foreach ($categories as $category)
<option value="{{$category->id}}">{{$category->name}}</option>
<?php // <option value="{{$category->id}}">{{$category->name}}</option>?>
@endforeach
</select>
</div>
<div>
<x-button>Submit</x-button>
</div>
Upvotes: 1
Views: 1548
Reputation: 111
Post Model Example:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Post extends Model
{
use HasFactory, SoftDeletes;
public function categories()
{
return $this->belongsToMany(Category::class);
}
}
Category Model Example:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Category extends Model
{
use HasFactory, SoftDeletes;
public function posts()
{
return $this->belongsToMany(Post::class);
}
}
For Relation Use This Migration:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCategoryPostTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('category_post', function (Blueprint $table) {
$table->bigInteger('category_id');
$table->bigInteger('post_id');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('category_post');
}
}
Example Controller:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Http\Request;
use App\Models\Post;
use App\Models\Category;
class ExampleController extends Controller
{
public function categoryPosts(Request $request)
{
return Category::find($request->category_id)->posts;
}
public function postCategories(Request $request)
{
return Post::find($request->post_id)->categories;
}
public function attaching(Request $request)
{
// $request->categories must be an array like [1,5,10,20,25]
// While you creating any post get category list from frontend and give category id list attach list, you can use attach(), detach() or sync() functions
Post::find($request->post_id)->attach($request->categories);
}
}
<select name="categories[]" id="category" multiple>
<option value="">- - Select a category - -</option>
@foreach ($categories as $category)
<option value="{{ $category->id }}">{{ $category->name }}</option>
@endforeach
</select>
Upvotes: 1