【问题标题】:Moving users on a ranking table based on placement根据位置在排名表上移动用户
【发布时间】:2017-08-30 10:14:36
【问题描述】:

代码基于我之前的问题 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();
}

用户 A = 展示位置:1

用户 B = 展示位置:2

如果用户B胜过用户A,那么号码序列将如下所示

用户 B = 展示位置:1

用户 A = 展示位置:2

用户 C = 展示位置:4

用户 D = 展示位置:5

用户 E = 展示位置:6

还有一个快速说明,问题仍然持续存在,但如果我将 increment 更改为 1 而不是 2,则以不同的方式.

【问题讨论】:

  • 什么是$ranklist_id
  • $ranklist_id 是一个 GET 路由参数,所以本质上它只是我们想要更改内容的排名列表的 ID。 (澄清一下:有几个排名。)

标签: php mysql laravel logic


【解决方案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();

}

希望这会有所帮助!

【讨论】:

  • whereNot 函数一直给出列错误,所以我只是将其更改为 where('id', '!=', $winner_ranking->id) ,并且效果很好。干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多