I'm guessing you are doing a standard tournament bracket style. So each level of the tournament corresponds to an amount of users that is a power of 2. 2^1 = 2 users, who would then play 1 game. 2^2 = 4 users, who would then play 2 games and then the winners play a game: 2+1=3. See the pattern? If you have a tournament with n levels, then it will have 2^n teams and the games you would need to play are (2^n)-1. If this is still confusing, draw it out, check my numbers, and then do the third level and the pattern will become more apparent. This may be helpful:
Levels Users Matches
1 2 1
2 4 3
3 8 7
4 16 15
As far as assigning and seeding users, I think your best option is to make a matches table that would keep track of all of your matches. Of course you would need to have a tournament id, user id's and anything else that is relevant for you. When you seed your users, then you can just insert them into your database. For example:
$match = new Match;
$match->tournament_id = $tournament_id;
$match->player_one_id = $player_one->id;
$match->player_two_id = $player_two->id;
$match->round = $round_number;
$match->winner = null; // Set that when the player wins
$match->save();
You can sort on a column like this:
Users::all()->orderBy('points', 'desc');