Search code examples
phpmysqllaravellogic

Moving users on a ranking table based on placement


Code is based on what Lvkz posted on my previous question, and it solved the bigger issue I was having. However I need help finding a way to avoid duplicates and just faulty number sequences.

$winner_ranking = $winner->getRankings()->where('ranklist_id', $ranklist_id)->first();
$loser_ranking = $loser->getRankings()->where('ranklist_id', $ranklist_id)->first();

if ($winner_ranking->placement > $loser_ranking->placement) {
    $rankings = ClubRanking::where('placement', '>', $loser_ranking->placement)
        ->where('ranklist_id', '=', $ranklist_id)
        ->increment('placement', 2);

    $winner_ranking->placement = $loser_ranking->placement;
    $winner_ranking->save();

    $loser_ranking->placement = $loser_ranking->placement + 1;
    $loser_ranking->save();
}

User A = Placement: 1

User B = Placement: 2

If User B wins over User A then the number sequence will look as follows

User B = Placement: 1

User A = Placement: 2

User C = Placement: 4

User D = Placement: 5

User E = Placement: 6

Also a quick note, the issue still persists but in a different way if I were to change the increment to 1 instead of 2.


Solution

  • This hasn't been tested but if I understand what you're after it should give you want you want:

    if ($winner_ranking->placement > $loser_ranking->placement) {
    
        $rankings = ClubRanking::whereBetween('placement', [$loser_ranking->placement, $winner_ranking->placement])
            ->where('id', '!=', $winner_ranking->id)
            ->where('ranklist_id', '=', $ranklist_id)
            ->increment('placement');
    
        $winner_ranking->placement = $loser_ranking->placement;
        $winner_ranking->save();
    
    }