Skip to content

Commit b998278

Browse files
committed
Development update
1 parent 2778674 commit b998278

File tree

7 files changed

+330
-633
lines changed

7 files changed

+330
-633
lines changed

src/Builder.php

Lines changed: 2 additions & 205 deletions
Original file line numberDiff line numberDiff line change
@@ -1,214 +1,11 @@
11
<?php
22

3-
namespace Wetzel\Datamapper\Versioning;
3+
namespace ProAI\Versioning;
44

55
use Illuminate\Database\Eloquent\Builder as BaseBuilder;
6-
use Illuminate\Database\Query\Builder as QueryBuilder;
76

87
class Builder extends BaseBuilder {
98

10-
/**
11-
* Insert a new record into the database.
12-
*
13-
* @param array $values
14-
* @return bool
15-
*/
16-
public function insert(array $values)
17-
{
18-
// get version values & values
19-
$versionValues = $this->getVersionValues($values);
20-
$values = $this->getValues($values);
21-
22-
// set version and latest_version
23-
$values[$this->model->getLatestVersionColumn()] = 1;
24-
$versionValues[$this->model->getVersionColumn()] = 1;
25-
26-
// insert main table record
27-
if(! $this->query->insert($values)) {
28-
return false;
29-
}
30-
31-
// insert version table record
32-
$db = $this->model->getConnection();
33-
return $db->table($this->model->getVersionTable())->insert($versionValues);
34-
}
35-
36-
/**
37-
* Update a record in the database.
38-
*
39-
* @param array $values
40-
* @return int
41-
*/
42-
public function update(array $values)
43-
{
44-
// update timestamps
45-
$values = $this->addUpdatedAtColumn($values);
46-
47-
// get version values & values
48-
$versionValues = $this->getVersionValues($values);
49-
$values = $this->getValues($values);
50-
51-
// get records
52-
$affectedRecords = $this->getAffectedRecordsWithVersion();
53-
54-
// update main table records
55-
if(! $this->query->increment($this->model->getLatestVersionColumn(), 1, $values)) {
56-
return false;
57-
}
58-
59-
// update version table records
60-
$db = $this->model->getConnection();
61-
foreach($affectedRecords as $id => $version) {
62-
$affectedRecordVersionValues = array_merge([
63-
$this->model->getVersionKeyName() => $id,
64-
$this->model->getVersionColumn() => $version+1
65-
], $versionValues);
66-
67-
if(! $db->table($this->model->getVersionTable())->insert($affectedRecordVersionValues)) {
68-
return false;
69-
}
70-
}
71-
72-
return true;
73-
}
74-
75-
/**
76-
* Delete a record from the database.
77-
*
78-
* @return mixed
79-
*/
80-
public function delete()
81-
{
82-
if (isset($this->onDelete)) {
83-
return call_user_func($this->onDelete, $this);
84-
}
85-
86-
$this->forceDelete();
87-
}
88-
89-
/**
90-
* Run the default delete function on the builder.
91-
*
92-
* @return mixed
93-
*/
94-
public function forceDelete()
95-
{
96-
// get version values & values
97-
$versionValues = $this->getVersionValues($values);
98-
$values = $this->getValues($values);
99-
100-
// get records
101-
$affectedRecords = $this->getAffectedRecordsWithVersion();
102-
103-
// delete main table records
104-
if(! $this->query->delete()) {
105-
return false;
106-
}
107-
108-
// delete version table records
109-
$db = $this->model->getConnection();
110-
return $db->table($this->model->getVersionTable())
111-
->whereIn($this->model->getVersionKeyName(), array_flip($affectedRecords))
112-
->delete();
113-
}
114-
115-
/**
116-
* Get affected records.
117-
*
118-
* @return array
119-
*/
120-
protected function getAffectedRecordsWithUpdatedVersion()
121-
{
122-
// model only
123-
if ($this->model->getKey()) {
124-
$records = [
125-
$this->model->getKey() => $this->model->{$this->model->getLatestVersionColumn()}
126-
];
127-
}
128-
129-
// mass assignment
130-
else {
131-
$records = [];
132-
foreach($this->query->get() as $record) {
133-
$records[$record->{$this->model->getKeyName()}] = $record->{$this->model->getLatestVersionColumn()};
134-
}
135-
}
136-
137-
return $records;
138-
}
139-
140-
/**
141-
* Get affected ids.
142-
*
143-
* @param array $values
144-
* @return array
145-
*/
146-
protected function getValues(array $values)
147-
{
148-
$versionedKeys = $this->model->getVersionedAttributeNames();
149-
150-
$array = array_diff_key($values, array_flip($versionedKeys));
151-
152-
return $array;
153-
}
154-
155-
/**
156-
* Get affected ids.
157-
*
158-
* @param array $values
159-
* @return array
160-
*/
161-
protected function getVersionValues(array $values)
162-
{
163-
$versionedKeys = $this->model->getVersionedAttributeNames();
164-
165-
$array = array_intersect_key($values, array_flip($versionedKeys));
166-
$array[$this->model->getVersionKeyName()] = $this->model->getKey();
167-
168-
return $array;
169-
}
170-
171-
/**
172-
* Add the "updated at" column to an array of values.
173-
*
174-
* @param array $values
175-
* @return array
176-
*/
177-
protected function addUpdatedAtColumn(array $values)
178-
{
179-
if (! $this->model->usesTimestamps() && ! $this->model->usesVersionTimestamps()) return $values;
180-
181-
if ($this->model->usesTimestamps()) {
182-
$column = $this->model->getUpdatedAtColumn();
183-
}
184-
185-
if ($this->model->usesVersionTimestamps()) {
186-
$column = $this->model->getUpdatedAtColumn();
187-
}
188-
189-
return array_add($values, $column, $this->model->freshTimestampString());
190-
}
191-
192-
/**
193-
* Get updatedAt timestamp.
194-
*
195-
* @return array
196-
*/
197-
protected function getUpdatedAtTimestamp()
198-
{
199-
if ( ! $model->usesTimestamps()) return $values;
200-
201-
return [$this->model->getUpdatedAtColumn() => $this->model->freshTimestampString()];
202-
}
203-
204-
/**
205-
* Get deletedAt timestamp.
206-
*
207-
* @return array
208-
*/
209-
protected function getDeletedAtTimestamp()
210-
{
211-
return [$this->model->getQualifiedDeletedAtColumn() => $this->model->freshTimestampString()];
212-
}
9+
use BuilderTrait;
21310

21411
}

0 commit comments

Comments
 (0)