У меня есть проблема, с которой я не могу обернуть голову.
Я использую Laravel Framework.
Я пытаюсь создать таблицу ранжирования на основе размещения (что означает, что у пользователя нет SCORE, у них просто есть места размещения)
Как я хочу, чтобы это работало следующим образом:
Пользователь A = Размещение: 1
Пользователь B = Размещение: 10
Пользователь B выигрывает за пользователя A , а затем пользователь B получает номер 1, а пользователь A помещается как номер 2 , а затем я хочу, чтобы он обновил все остальные пользователи соответственно.
Я не могу найти надежный способ сделать это.
Я не думаю, что это вызов Laravel, но SQL-код. И это может быть просто решить: в основном, вы будете запрашивать фактическое положение побежденного, если позиция больше победителя, вы ничего не делаете, иначе вы назначите позицию проигравшего новому победителю и обновите остальная часть таблицы с +1 в столбце позиции.
В коде это будет примерно так:
$winner_player = User::where('id', userA->id)->first(); $loser_player = User::where('id', userB->id)->first(); if($winner_player->position < $loser_player->position) { //Update the rest of the users. //We add 2 because we need space for the new winner and for //the loser that is still above of the rest of the players. DB::table('users') ->where('position', '>', $loser_player->position) ->update(DB::raw('position+2')); //Set the winner with the actual position of the loser. $winner_player->position = $loser_player->position; $winner_player->save(); //Set the looser with the new position (+1 of his actual). $loser_player->position = $loser_player->position + 1; $loser_player->save(); }
ОБНОВЛЕННАЯ ЛОГИКА Как было указано, она перемещает строки вокруг, но не делает это правильно, поэтому я обновляю логику, чтобы она работала так, как она должна быть, и она будет немного проще.
$winner_player = User::where('id', userA->id)->first(); $loser_player = User::where('id', userB->id)->first(); if($winner_player->position < $loser_player->position) { //Set the winner with the actual position of the loser. $winner_player->position = $loser_player->position; //Update the users between the swap. There is no need to update //the whole table, we only update the records between the swap. DB::table('users') ->where([['position', '<', $winner_player->position], ['position', '>=', $loser_player->position]]) ->update(DB::raw('position+1')); //Save the value of the winner AFTER updating the positions //between winner and loser. $winner_player->save(); }