Home > Net >  How can I with pivot table get related creator of table?
How can I with pivot table get related creator of table?

Time:02-05

In laravel 9 app I create many top many relation with table

return new class extends Migration {
    public function up()
    {
        Schema::create('article_vote', function (Blueprint $table) {
            $table->id();
            $table->foreignId('article_id')->references('id')->on('articles')->onUpdate('RESTRICT')->onDelete('CASCADE');
            $table->foreignId('vote_id')->references('id')->on('votes')->onUpdate('RESTRICT')->onDelete('CASCADE');

            $table->boolean('active')->default(false);
            $table->date('expired_at')->nullable();

            $table->integer('supervisor_id')->nullable()->unsigned();
            $table->foreign('supervisor_id')->references('id')->on('users')->onDelete('CASCADE');
            $table->mediumText('supervisor_notes')->nullable();

            $table->timestamp('created_at')->useCurrent();
            $table->timestamp('updated_at')->nullable();

            $table->unique(['vote_id', 'article_id'], 'article_vote_vote_id_article_id_index');
            $table->index(['vote_id', 'article_id', 'active', 'expired_at'], 'article_vote_vote_id_article_id_active_expired_at_index');
            $table->index([ 'expired_at', 'active',], 'article_vote_expired_at_active_index');
            $table->index(['created_at'], 'article_vote_created_at_index');
        });

        Artisan::call('db:seed', array('--class' => 'articleVotesWithInitData'));


    }

In app/Models/Vote.php I also have creator method :

public function articles(): BelongsToMany
{
    return $this->belongsToMany(Article::class, 'article_vote', 'vote_id')
                ->withTimestamps()
                ->withPivot(['active', 'expired_at', 'supervisor_id', 'supervisor_notes']);
}

public function creator(): BelongsTo
{
    return $this->belongsTo(User::class, 'creator_id', 'id');
}

and in app/Models/Article.php :

public function votes(): BelongsToMany
{
    return $this->belongsToMany(Vote::class, 'article_vote', 'article_id')
        ->withTimestamps()
        ->withPivot(['active', 'expired_at', 'supervisor_id', 'supervisor_notes']);
}

Getting votes by article I also would like to get related creator of any vote li8ke :

$articleVotes = $article->votes->with('creator');

But I got error:

BadMethodCallException: Method Illuminate\Database\Eloquent\Collection::with does not exist. in /mnt/_work_sdb8/wwwroot/lar/MS/MS_Votes/vendor/laravel/framework/src/Illuminate/Macroable/Traits/Macroable.php:113

Can I do it in some or other way ?

Thanks!

CodePudding user response:

I think you need to change the relationship method for load creator in votes.

For that you need to change your code to :

$articleVotes = $article->votes; 
$articleVotes->load('creator');
  • Related