Skip to the content.


Laravel Tournaments
Laravel Tournaments

A Laravel plugin that generate tournaments out of the box

Latest Stable Version Total Downloads Scrutinizer Code Quality Build Status Code Coverage


Laravel Tournaments Demo

Features

Installation

NOTE: Depending on your version of Laravel, you should install a different version of the package:

Laravel Version Laravel Tournament Version
8 0.17
5.8 -> 7 0.16
5.7 0.15
5.6 0.14
5.5 0.13

First, you’ll need to install the package via Composer:

composer require "xoco70/laravel-tournaments"

Finally, from the command line again, publish the default configuration file:

php artisan vendor:publish --tag=laravel-tournaments --force

Demo

To run the demo, you need to generate Tournaments, Championships, Users, Competitors and Settings

Run Migrations:

php artisan migrate
composer dump-autoload

Seed dummy data:

php artisan db:seed --class=LaravelTournamentSeeder

WARNING: Don’t do this in production, it would wipe all your data. Use this line for demo purpose only

Add TreeController ( you can find it in demo repository)

Add your custom routes

Route::get('/', 'App\Http\Controllers\TreeController@index')->name('tree.index');
Route::post('/championships/{championship}/trees', 'App\Http\Controllers\TreeController@store')->name('tree.store');
Route::put('/championships/{championship}/trees', 'App\Http\Controllers\TreeController@update')->name('tree.update');
php artisan db:seed --class=LaravelTournamentSeeder

You will be able to access the demo at http://yourdomain.com/

Usage

// Create a tournament

$tournament = factory(Tournament::class)->create(['user_id' => Auth::user()->id]);

$championsip = factory(Championship::class)->create(['$tournament_id' => $tournament->id]);

// Optional, if not defined, it will take default in ChampionshipSettings

$settings = factory(ChampionshipSettings::class)->create(['championship_id' => $championship->id]);

// Add competitors to championship

$competitors = factory(\App\Competitor::class,10)->create([
    'championship_id' => $championship->id,
     'user_id' => factory(User::class)->create()->id
]);

// Define strategy to generate

$generation = $championship->chooseGenerationStrategy();

// Generate everything

$generation->run();

// Just generate Tree

$this->generateAllTrees();

// Just generate Fight List

$this->generateAllFights();

Data model

Database Model

Models

Tournament

$tournament->owner; // get owner
$tournament->venue; // get venue
$tournament->championships; // get championships 

Check tournament type:

$tournament->isOpen()
$tournament->needsInvitation()

Check tournament level:

$tournament ->isInternational()
$tournament->isNational() 
$tournament->isRegional()
$tournament->isEstate()
$tournament->isMunicipal()
$tournament->isDistrictal()
$tournament->isLocal()
$tournament->hasNoLevel()

Championship

$championship->competitors; // Get competitors
$championship->teams; // Get teams
$championship->fighters; // Get fighters
$championship->category; // Get category
$championship->tournament; // Get tournament
$championship->users; // Get users
$championship->settings; // Get settings
$championship->fightersGroups; // Get groups 
$championship->groupsByRound($numRound = 1); // Get groups for a specific round
$championship->groupsFromRound($numRound = 1); // Get groups from a specific round
$championship->fights; // Get fights
$championship->firstRoundFights; // Get fights for the first round only ( Useful when has preliminary )
$championship->fights($numRound = 1); // Get fights for a specific round

NOTE: $fighter can be an instance of Team or Competitor

Determine strategy:

$championship->isPlayoffCompetitor()
$championship->isPlayoffTeam()
$championship->isSingleEliminationCompetitor()
$championship->isSingleEliminationTeam()

Determine group size:

$championship->getGroupSize()

Determine championship type:

$championship->hasPreliminary()
$championship->isPlayOffType()
$championship->isSingleEliminationType()

FightersGroup

$group->championship; // Get championship
$group->fights; // Get fights
$group->fighters; // Get fighters
$group->teams; // Get teams
$group->competitors; // Get competitors
$group->users; // Get users

NOTE: $fighter can be an instance of Team or Competitor

To get the instance name:

$group->getFighterType() // Should return Team::class or Competitor::class

NOTE: This plugin use laravel-nestedset. This means you can navigate with $group->children() or $group->parent() or use any methods available in this great plugin.

Competitor

$competitor->user; // Get user

Team

// Create a team

$team = factory(Team::class)
    ->create([ championship_id' => $championship->id]);
// Add competitor to team 

$team->competitors()->attach($competitor->id);

// Remove competitor from a team 

$team->competitors()->detach($competitor->id);

Fight

$fight->group; // Get group
$fight->competitor1; // Get competitor1
$fight->competitor2; // Get competitor2
$fight->team1; // Get team1
$fight->team2; // Get team2

Views

Preliminary tree

@include('laravel-tournaments::partials.tree.preliminary') // Preliminary table

Single Elimination tree

@include('laravel-tournaments::partials.tree.singleElimination', ['hasPreliminary' => 0]) 

Fight List

@include('laravel-tournaments::partials.fights')

Run Functional Tests

vendor/bin/phpunit tests

Limitations

This is a work in progress, and tree creation might be very complex, so there is a bunch of things to achieve.

Troubleshooting

Specified key was too long error

For those running MariaDB or older versions of MySQL you may hit this error when trying to run migrations: As outlined in the Migrations guide to fix this all you have to do is edit your AppServiceProvider.php file and inside the boot method set a default string length:

use Illuminate\Support\Facades\Schema;

public function boot()
{
Schema::defaultStringLength(191);
}

With this configuration, you must have at least…

This error means you don’t have enough competitors / teams to create given tree Try to increase competitor number, decrease areas or preliminary group size, if preliminary round is active

ChangeLog: