Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
100.00% |
22 / 22 |
|
100.00% |
2 / 2 |
CRAP | |
100.00% |
1 / 1 |
Builder | |
100.00% |
22 / 22 |
|
100.00% |
2 / 2 |
3 | |
100.00% |
1 / 1 |
orderByValues | |
100.00% |
5 / 5 |
|
100.00% |
1 / 1 |
1 | |||
updateColumnWithRowNumber | |
100.00% |
17 / 17 |
|
100.00% |
1 / 1 |
2 |
1 | <?php |
2 | |
3 | namespace Baril\Orderly\Mixins; |
4 | |
5 | use Illuminate\Database\Query\Builder as QueryBuilder; |
6 | |
7 | /** |
8 | * @mixin QueryBuilder |
9 | */ |
10 | class Builder |
11 | { |
12 | public function orderByValues() |
13 | { |
14 | return function ($expression, array $values): QueryBuilder { |
15 | /** @var QueryBuilder $this */ |
16 | $cases = array_combine($values, range(1, count($values))); |
17 | $case = $this->getGrammar()->compileCase($expression, $cases, count($values) + 1); |
18 | return $this->orderByRaw($case); |
19 | }; |
20 | } |
21 | |
22 | public function updateColumnWithRowNumber() |
23 | { |
24 | return function (string $column): int { |
25 | /** @var QueryBuilder $this */ |
26 | |
27 | $connection = $this->getConnection(); |
28 | $grammar = $this->getGrammar(); |
29 | |
30 | return $connection->transaction(function () use ($column, $connection, $grammar) { |
31 | if ($grammar->supportsSequences()) { |
32 | $connection->statement($grammar->compileCreateSequence('rownum')); |
33 | $update = $this->update([$column => $connection->raw($grammar->compileNextVal('rownum'))]); |
34 | $connection->statement($grammar->compileDropSequence('rownum')); |
35 | return $update; |
36 | } else { |
37 | $rownum = 0; |
38 | return $this->cursor()->map(function ($row) use ($column, &$rownum) { |
39 | return $this->clone()->where((array) $row)->limit(1)->update([ |
40 | $column => ++$rownum, |
41 | ]); |
42 | })->sum(); |
43 | } |
44 | }); |
45 | }; |
46 | } |
47 | } |