Intereting Posts
mongo Ошибка PHP-приложения: Неустранимая ошибка: исключить исключение «MongoException» с сообщением «». не разрешено в ключе Как создать атаку SQL-инъекций с помощью Shift-JIS и CP932? Понимание того, что \ u0000 находится в PHP / JSON и избавиться от него Как получить контроллер из плагина контроллера в zendframework 2? Как добавить поле на странице продукта WooCommerce? Получите все записи из базы данных MySQL, которые находятся в Картах Google .getBounds? Сравнить 2 изображений в php cakephp 2 – разбиение на страницы за пределами первой страницы не работает php & mySQL: запрос не использует индекс в соединении таблицы Удаление ссылки на индекс массива при использовании json_encode в php Пребывание на той же странице без обновления после добавления в базу данных add_action в wordpress с помощью OOP? mysqli: может ли он подготовить несколько запросов в одном выражении? Кто-нибудь знает о плагине проверки орфографии для ckeditor, который использует aspell или аналогичную локальную службу вместо spellchecker.net? Помощь в логическом программировании

Ранжирование на основе размещения пользователей вместо оценки

У меня есть проблема, с которой я не могу обернуть голову.

Я использую 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(); }