обновить ранг записей с помощью laravel построителя запросов - PullRequest
3 голосов
/ 29 апреля 2020

Поэтому я использую laravel 5.8 и у меня есть следующая таблица с именем tasks

id |  name  | rank
------------------
 1 | task 1 |  4
------------------
 2 | task 2 |  3
------------------
 3 | task 3 |  2
------------------
 4 | task 4 |  1

И когда я хочу отобразить эти задачи, я сортирую их столбец ordredBy rank (который unique столбец), и если я хочу изменить ранг для одной задачи, мне нужно обновить ранг всех задач

Я хотел бы использовать этот запрос:

UPDATE   tasks
JOIN     (SELECT    t.id,
                @curRank := @curRank + 1 AS rank
      FROM      tasks t
      JOIN      (SELECT @curRank := 0) r
      ORDER BY  t.rank DESC
     ) ranks ON (ranks.id = tasks.id)

SET taks.rank = ranks.rank;

, поэтому я сделал выделенную часть из запроса:

DB::table('tasks ta')
        ->select(DB::raw('ta.id, @curRank := @curRank + 1 as rank'))
        ->crossJoin(DB::raw('select @curRank : 0 as r'))
        ->orderBy('ta.rank', 'desc');

, но я не понял, как объединить обновление с оператором select в laravel построителе запросов .

1 Ответ

1 голос
/ 29 апреля 2020

На самом деле вам не нужно обновлять все ранги, просто обновите значение между currentRank и Ожидаемый рейтинг .

Пример. Допустим, вы хотите обновить ранг с задачи 1 с ранга 4 на ранг 2. Вы просто перемещаете ранг между currentRank и ожидаемым Rank

$expectedRank = 2;
$id = 1;
$task = Task::find($id);

// check if $task->rank != $expectedRank then do this query
$ids = Task::whereBetween('rank', [min($task->rank, $expectedRank), max($task->rank, $expectedRank)])
           ->where("id", "!=", $task->id)
           ->orderBy("rank")
           ->pluck("id");
$task->rank = $expectedRank;
$task->save();

$updates = Task::whereIn("id", $ids)
               ->update([
                  'rank'=> $task->rank > $expectedRank ? DB::raw('rank+1') : DB::raw('rank-1')
               ]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...