2017-08-30 18 views
2

コードは以前の質問でLvkz postedの内容を基にしており、大きな問題を解決しました。しかし、私は重複を避ける方法を見つける助けと番号の順序が間違っている必要があります。プレースメントに基づくランキング表のユーザー移動

$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(); 
} 

ユーザ =配置:1

ユーザB =配置:2

場合は、ユーザーB ユーザA勝利次のように数列が見えます

ユーザB =配置:1

ユーザ =配置:2

ユーザC =配置:4

ユーザD =配置:5

ユーザーE =配置:6

また

簡単なメモ、問題はまだを持続するが、私は代わりに2

+0

'$ ranklist_id'とは何ですか? –

+0

$ ranklist_idはGETルートパラメータなので、本質的にはそれを変更したいランクリストのIDです。 – Classified

答えて

1

の1にインクリメントを変更した場合、別の方法でこれはテストされていませんが、私は理解している場合あなたが望んでいた後に何をしたいのですか:

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(); 

} 

これは役に立ちます。

+0

whereNot関数は列エラーを出し続けていたので、代わりにどこに( 'id'、 '!='、$ winner_ranking-> id)の場所に変更したところ、完全に機能しました。乾杯。 – Classified