Nolan Rassant
Nolan Rassant

Reputation: 33

How to attach pivot to table with multiple values [LARAVEL]

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

Answers (1)

Talha Can
Talha Can

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

Related Questions