Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
22 / 22
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
Builder
100.00% covered (success)
100.00%
22 / 22
100.00% covered (success)
100.00%
2 / 2
3
100.00% covered (success)
100.00%
1 / 1
 orderByValues
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 updateColumnWithRowNumber
100.00% covered (success)
100.00%
17 / 17
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3namespace Baril\Orderly\Mixins;
4
5use Illuminate\Database\Query\Builder as QueryBuilder;
6
7/**
8 * @mixin QueryBuilder
9 */
10class 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}