1: | <?php |
2: | |
3: | namespace Baril\Orderly\Mixins; |
4: | |
5: | use Illuminate\Database\Query\Builder as QueryBuilder; |
6: | |
7: | |
8: | |
9: | |
10: | class Builder |
11: | { |
12: | public function orderByValues() |
13: | { |
14: | return function ($expression, array $values): QueryBuilder { |
15: | |
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: | |
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: | } |
48: | |