2017-08-29 13 views
0

私は私の頭を包み込むことができないという問題があります。スコアの代わりにユーザーの配置に基づいたランク付け

私はLaravel Frameworkを使用しています。

私が配置に基づいてランキング表を作成しようとしています(ユーザー意味がどのSCOREを持っていない、彼らはただの配置を持っている)

私はそれが仕事をしたいどのように次のようである:

ユーザ =配置:1

ユーザB =配置:10

ユーザBユーザ勝ユーザB数1ユーザーに配置されます次に番号2として配置されます、そして、私はそれに応じて、他のすべてのユーザーを更新します。

私はこれを行う信頼できる方法を見つけることができないようです。

+0

Laravelのすべての魔法であなたはそれをしませんか?私はうんざりしています。データベースの行を更新するだけです。配置の代わりに、パーセンテージを行うこともできます。それはずっと簡単でしょう。 –

+0

@BrianGottier私は私が従うかどうかはわかりませんが、代わりにパーセンテージを使って何を意味するのか分かりません。配置は基本的にユーザーのランクです。勝者と敗者のランクを更新すると、重複(同じランクの2人のユーザー)があります - どうすればそれを避けることができますか? – Classified

+0

実際、これを見てみましょう:https://stackoverflow.com/questions/5207267/update-increment-a-single-column-on-multiple-rows-at-onceそしてそこにwhere句を想像してください。また、クエリで減算することもできます。把握するのは難しいはずがありません。 –

答えて

1

私はこれが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(); 
} 
+0

私は間違いなくこれを試してみて、それがどうなるか見てみましょう。試して試してみると、私はコメントします。 – Classified

+0

これにより根本的な問題が修正されました。ただし、3人のユーザーしかいない場合は正しく動作しません.2位のユーザーが1位に移動すると3位は5位になります。 – Classified

+0

あなたは正しいです!私はすべてのレコードを更新しなければならないという前提でロジックを実行しましたが、実際には更新する必要があるレコードは位置スワップ間のものです。私は新しく提案されたロジックで私の答えを更新しました。 – Lvkz

関連する問題