| 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() && $grammar->supportsUpdateWithOrderBy()) { |
| 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: | |