Passed
Push — refactor/improve-static-analys... ( efcf20...37f12c )
by Bas
03:04
created

Builder::updateTimestamps()   A

Complexity

Conditions 6
Paths 3

Size

Total Lines 27
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 17
CRAP Score 6

Importance

Changes 0
Metric Value
eloc 16
c 0
b 0
f 0
dl 0
loc 27
ccs 17
cts 17
cp 1
rs 9.1111
cc 6
nc 3
nop 1
crap 6
1
<?php
2
3
declare(strict_types=1);
4
5
namespace LaravelFreelancerNL\Aranguent\Eloquent;
6
7
use Illuminate\Database\Eloquent\Builder as IlluminateEloquentBuilder;
8
use Illuminate\Support\Arr;
9
use LaravelFreelancerNL\Aranguent\Eloquent\Concerns\QueriesAranguentRelationships;
10
use LaravelFreelancerNL\Aranguent\Query\Builder as QueryBuilder;
11
12
class Builder extends IlluminateEloquentBuilder
13
{
14
    use QueriesAranguentRelationships;
0 ignored issues
show
introduced by
The trait LaravelFreelancerNL\Aran...sAranguentRelationships requires some properties which are not provided by LaravelFreelancerNL\Aranguent\Eloquent\Builder: $grammar, $from
Loading history...
15
16
    /**
17
     * The base query builder instance.
18
     *
19
     * @var QueryBuilder
20
     */
21
    protected $query;
22
23
    /**
24
     * Insert a record in the database.
25
     *
26
     *
27
     * @param array<mixed> $values
28
     * @return bool
29
     */
30 6
    public function insert(array $values)
31
    {
32
        // Since every insert gets treated like a batch insert, we will make sure the
33
        // bindings are structured in a way that is convenient when building these
34
        // inserts statements by verifying these elements are actually an array.
35 6
        if (empty($values)) {
36
            return true;
37
        }
38
39 6
        if (Arr::isAssoc($values)) {
40 6
            $values = [$values];
41
        }
42 6
        if (!Arr::isAssoc($values)) {
43
            // Here, we will sort the insert keys for every record so that each insert is
44
            // in the same order for the record. We need to make sure this is the case
45
            // so there are not any errors or problems when inserting these records.
46 6
            foreach ($values as $key => $value) {
47 6
                ksort($value);
48
49 6
                $values[$key] = $value;
50
            }
51
        }
52
53
        //Set timestamps
54 6
        foreach ($values as $key => $value) {
55 6
            $values[$key] = $this->updateTimestamps($value);
56
        }
57
58 6
        return $this->toBase()->insert($values);
59
    }
60
61
    /**
62
     * Add the "updated at" column to an array of values.
63
     *
64
     * @param array<string, string> $values
65
     * @return array<string, string>
66
     */
67 6
    protected function updateTimestamps(array $values)
68
    {
69
        if (
70 6
            !$this->model->usesTimestamps() ||
71 2
            is_null($this->model->getUpdatedAtColumn()) ||
72 6
            is_null($this->model->getCreatedAtColumn())
73
        ) {
74 4
            return $values;
75
        }
76
77 2
        $timestamp = $this->model->freshTimestampString();
78 2
        $updatedAtColumn = $this->model->getUpdatedAtColumn();
79
80 2
        $timestamps = [];
81 2
        $timestamps[$updatedAtColumn] = $timestamp;
82
83 2
        $createdAtColumn = $this->model->getCreatedAtColumn();
84 2
        if (!isset($values[$createdAtColumn]) && !isset($this->model->$createdAtColumn)) {
85 2
            $timestamps[$createdAtColumn] = $timestamp;
86
        }
87
88 2
        $values = array_merge(
89 2
            $timestamps,
90 2
            $values
91 2
        );
92
93 2
        return $values;
94
    }
95
96
    /**
97
     * Add the "updated at" column to an array of values.
98
     *
99
     * @param array<string> $values
100
     * @return array<string>
101
     */
102 22
    protected function addUpdatedAtColumn(array $values): array
103
    {
104
        if (
105 22
            !$this->model->usesTimestamps() ||
106 22
            is_null($this->model->getUpdatedAtColumn())
107
        ) {
108
            return $values;
109
        }
110
111 22
        $column = $this->model->getUpdatedAtColumn();
112
113 22
        $values = array_merge(
114 22
            [$column => $this->model->freshTimestampString()],
115 22
            $values
116 22
        );
117
118 22
        return $values;
119
    }
120
121
    /**
122
     * Get the underlying query builder instance.
123
     *
124
     * @return QueryBuilder
125
     */
126 51
    public function getQuery()
127
    {
128 51
        return $this->query;
129
    }
130
}
131