Skip to content
Advertisement

Laravel relation from a pivot

I have a relation that I cant figure out my current application looks like this

Models

User.php
    public function teams()
    {
        return $this->belongsToMany(Team::class);
    }
Team.php

    public function tournaments()
    {
        return $this->belongsToMany(Tournament::class);
    }
Tournament.php

    public function teams()
    {
        return $this->belongsToMany(Team::class);
    }

Tables

tournaments
id
teams
id
team_tournament
tournament_id
team_id

Now a tournament can have just some of the users participate in the tournament so I’ve created the below

team_tournament_users
tournament_id
team_id
user_id

To store users that are participating in a tournament from the team.

How should this look in terms of eloquent relations?

Advertisement

Answer

So taking your team_tournament_users, I would do the following

Would use the naming convention participants of tournament, so table name would be participants instead of team_tournament_users

Migration

<?php

use IlluminateSupportFacadesSchema;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;

class CreateParticipantsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('participants', function (Blueprint $table) {
            $table->foreignId('tournament_id')->constrained();
            $table->foreignId('user_id')->constrained();
            $table->foreignId('team_id')->constrained();
            $table->timestamps();

            $table->primary(['tournament_id', 'user_id']);
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('participants');
    }
}

Relationships: Then would define the following relationships in models

class User extends Model
{

    public function teams()
    {
        return $this->belongsToMany(Team::class);
    }

    public function tournaments()
    {
        return $this->belongsToMany(Tournament::class, 'participants')
            ->withPivot('team_id')
            ->withTimestamps();
    }
}


class Tournament extends Model
{

    public function teams()
    {
        return $this->belongsToMany(Team::class);
    }

    public function participants()
    {
        return $this->belongsToMany(User::class, 'participants')
            ->withPivot('team_id')
            ->withTimestamps();
    }
}

class Team extends Model
{

    public function users()
    {
        return $this->belongsToMany(User::class)->withTimestamps();
    }

    public function tournaments()
    {
        return $this->belongsToMany(Tournament::class)->withTimestamps();
    }
}

How would I then go about retrieving all the users participating in the team for a specific tournament? So if 3 users/members from a team are selected for the tournament how can I easily find out which members from that team are selected?

//There's already a relation between Tournament and Team(s)
//So we can use it to get the tournament participants from the team

$t = Tournament::with('participants')->first()
  ->participants
  ->groupBy(function($participant){
    return $participant->pivot->team_id;    
  });

//If Team with an id of 5 has members participating in the tournament
//Then we can get the members of Team as
$team = Team::findOrFail(5);
$t->get($team->id);
User contributions licensed under: CC BY-SA
10 People found this is helpful
Advertisement