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: }
48: