-
Notifications
You must be signed in to change notification settings - Fork 159
Expand file tree
/
Copy pathUpdateDataSQL.php
More file actions
62 lines (55 loc) · 2.36 KB
/
UpdateDataSQL.php
File metadata and controls
62 lines (55 loc) · 2.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?php namespace DBDiff\SQLGen\DiffToSQL;
use DBDiff\SQLGen\SQLGenInterface;
use DBDiff\SQLGen\Dialect\DialectRegistry;
use DBDiff\SQLGen\Dialect\SQLDialectInterface;
use DBDiff\DB\Data\BinaryValue;
use Diff\DiffOp\DiffOpAdd;
use Diff\DiffOp\DiffOpRemove;
class UpdateDataSQL implements SQLGenInterface {
protected $obj;
protected SQLDialectInterface $dialect;
public function __construct($obj, SQLDialectInterface $dialect = null) {
$this->obj = $obj;
$this->dialect = $dialect ?? DialectRegistry::get();
}
public function getUp(): string {
$t = $this->dialect->quote($this->obj->table);
$d = $this->dialect;
$values = $this->obj->diff['diff'];
array_walk($values, function (&$diff, $column) use ($d) {
$q = $d->quote($column);
if ($diff instanceof DiffOpRemove) {
$diff = "$q = NULL";
} elseif (!method_exists($diff, 'getNewValue') || is_null($diff->getNewValue())) {
$diff = "$q = NULL";
} else {
$diff = "$q = " . BinaryValue::formatSQL($diff->getNewValue());
}
});
$keys = $this->obj->diff['keys'];
array_walk($keys, function (&$value, $column) use ($d) {
$value = BinaryValue::formatCondition($d->quote($column), $value);
});
return "UPDATE $t SET " . implode(', ', $values) . ' WHERE ' . implode(' AND ', $keys) . ';';
}
public function getDown(): string {
$t = $this->dialect->quote($this->obj->table);
$d = $this->dialect;
$values = $this->obj->diff['diff'];
array_walk($values, function (&$diff, $column) use ($d) {
$q = $d->quote($column);
if ($diff instanceof DiffOpAdd) {
$diff = "$q = NULL";
} elseif (!method_exists($diff, 'getOldValue') || is_null($diff->getOldValue())) {
$diff = "$q = NULL";
} else {
$diff = "$q = " . BinaryValue::formatSQL($diff->getOldValue());
}
});
$keys = $this->obj->diff['keys'];
array_walk($keys, function (&$value, $column) use ($d) {
$value = BinaryValue::formatCondition($d->quote($column), $value);
});
return "UPDATE $t SET " . implode(', ', $values) . ' WHERE ' . implode(' AND ', $keys) . ';';
}
}