You can use an extra column in the pivot table to set the role_id between the game and the designer. However, it's not possible to set this up as a real relationship between game and role or designer and role. You can create a pivot model and add the relationship in there.
class DesignGame extends Pivot
{
protected $table = 'design_game';
public function role()
{
$this->belongsTo(Role::class);
}
}
Then in your code, you can do this:
$game = Game::with('designers')->find(1);
$game->designers->first()->pivot->role;
This should put you in the right direction
Finally, you can add a unique constraint on all three columns to make sure they are always unique.
Schema::table('design_game', function (Blueprint $table) {
$table->foreignId('game_id')->references('id')->on('games');
$table->foreignId('designer_id')->references('id')->on('designers');
$table->foreignId('role_id')->references('id')->on('roles');
$table->unique(['game_id', 'designer_id', 'role_id']);
});
Note that the above code is the new Laravel 7 syntax for creating a column including foreign keys in migrations.