Test Setup Failed
Push — master ( bf4a35...908938 )
by Ben
23:24 queued 15:29
created

SortModels::handle()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 2
c 1
b 0
f 0
dl 0
loc 5
rs 10
cc 1
nc 1
nop 2
1
<?php
2
declare(strict_types=1);
3
4
namespace Thinktomorrow\Chief\Management\Application;
5
6
use Illuminate\Support\Facades\DB;
7
8
class SortModels
9
{
10
    public function handle(string $modelClass, array $indices): void
11
    {
12
        $table = (new $modelClass())->getTable();
13
14
        static::batchUpdateColumn($table, 'order', $indices);
15
    }
16
17
    /** Taken from: https://github.com/laravel/ideas/issues/575 */
18
    private static function batchUpdateColumn(string $table, string $column, array $indices)
19
    {
20
        $cases = [];
21
        $ids = [];
22
        $params = [];
23
24
        foreach ($indices as $index => $modelId) {
25
            $id = (int) $modelId;
26
            $cases[] = "WHEN {$id} then ?";
27
            $params[] = $index;
28
            $ids[] = $id;
29
        }
30
31
        $ids = implode(',', $ids);
32
        $cases = implode(' ', $cases);
33
34
        DB::update("UPDATE `{$table}` SET `{$column}` = CASE `id` {$cases} END WHERE `id` in ({$ids})", $params);
35
    }
36
}
37