-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDeleteQuery.php
More file actions
151 lines (129 loc) · 4.57 KB
/
DeleteQuery.php
File metadata and controls
151 lines (129 loc) · 4.57 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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<?php
/*
* Opulence
*
* @link https://www.opulencephp.com
* @copyright Copyright (C) 2021 David Young
* @license https://github.com/opulencephp/Opulence/blob/1.2/LICENSE.md
*/
namespace Opulence\QueryBuilders;
use InvalidArgumentException;
use Opulence\QueryBuilders\Conditions\ICondition;
/**
* Builds a delete query
*/
class DeleteQuery extends Query
{
/** @var array The list of table expressions, allowing columns from other table to appear in the WHERE condition */
protected $usingExpressions = [];
/** @var ConditionalQueryBuilder Handles functionality common to conditional queries */
protected $conditionalQueryBuilder = null;
/**
* @param string $tableName The name of the table we're querying
* @param string $tableAlias The alias of the table we're querying
*/
public function __construct(string $tableName, string $tableAlias = '')
{
$this->tableName = $tableName;
$this->tableAlias = $tableAlias;
$this->conditionalQueryBuilder = new ConditionalQueryBuilder();
}
/**
* Adds to a "USING" expression
*
* @param string ...$expression A variable list of other tables' names to use in the WHERE condition
* @return self For method chaining
*/
public function addUsing(string ...$expression) : self
{
$this->usingExpressions = array_merge($this->usingExpressions, $expression);
return $this;
}
/**
* Adds to a "WHERE" condition that will be "AND"ed with other conditions
*
* @param string ...$conditions A variable list of conditions to be met
* @return self For method chaining
*/
public function andWhere(...$conditions) : self
{
$this->conditionalQueryBuilder->andWhere(
...$this->createConditionExpressions($conditions)
);
return $this;
}
/**
* @inheritdoc
*/
public function getSql() : string
{
$sql = "DELETE FROM {$this->tableName}" . (empty($this->tableAlias) ? '' : " AS {$this->tableAlias}");
if (count($this->usingExpressions) > 0) {
$sql .= ' USING ' . implode(', ', $this->usingExpressions);
}
// Add any conditions
$sql .= $this->conditionalQueryBuilder->getClauseConditionSql('WHERE',
$this->conditionalQueryBuilder->getWhereConditions());
return $sql;
}
/**
* Adds to a "WHERE" condition that will be "OR"ed with other conditions
*
* @param string ...$conditions A variable list of conditions to be met
* @return self For method chaining
*/
public function orWhere(...$conditions) : self
{
$this->conditionalQueryBuilder->orWhere(
...$this->createConditionExpressions($conditions)
);
return $this;
}
/**
* Starts a "USING" expression
* Only call this method once per query because it will overwrite any previously-set "USING" expressions
*
* @param string ...$expression A variable list of other tables' names to use in the WHERE condition
* @return self For method chaining
*/
public function using(string ...$expression) : self
{
$this->usingExpressions = $expression;
return $this;
}
/**
* Starts a "WHERE" condition
* Only call this method once per query because it will overwrite any previously-set "WHERE" expressions
*
* @param string ...$conditions A variable list of conditions to be met
* @return self For method chaining
*/
public function where(...$conditions) : self
{
$this->conditionalQueryBuilder->where(
...$this->createConditionExpressions($conditions)
);
return $this;
}
/**
* Converts a list of condition strings or objects to their string representations
*
* @param array $conditions The list of strings of condition objects to convert
* @return array The list of condition expressions
*/
private function createConditionExpressions(array $conditions) : array
{
$conditionExpressions = [];
foreach ($conditions as $condition) {
if ($condition instanceof ICondition) {
$this->addUnnamedPlaceholderValues($condition->getParameters());
$conditionExpressions[] = $condition->getSql();
} elseif (is_string($condition)) {
$conditionExpressions[] = $condition;
} else {
throw new InvalidArgumentException('Condition must either be string or ICondition object');
}
}
return $conditionExpressions;
}
}