私はこれが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();
}
UPDATED LOGIC 分類が指摘したように、それは周りの行を移動しますが、それを正しく行いませんので、私は、ロジックを更新していますそれが想定どおりに動作するようにしてください。少しでも簡単になります。
$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();
}
Laravelのすべての魔法であなたはそれをしませんか?私はうんざりしています。データベースの行を更新するだけです。配置の代わりに、パーセンテージを行うこともできます。それはずっと簡単でしょう。 –
@BrianGottier私は私が従うかどうかはわかりませんが、代わりにパーセンテージを使って何を意味するのか分かりません。配置は基本的にユーザーのランクです。勝者と敗者のランクを更新すると、重複(同じランクの2人のユーザー)があります - どうすればそれを避けることができますか? – Classified
実際、これを見てみましょう:https://stackoverflow.com/questions/5207267/update-increment-a-single-column-on-multiple-rows-at-onceそしてそこにwhere句を想像してください。また、クエリで減算することもできます。把握するのは難しいはずがありません。 –