‪TYPO3CMS  ‪main
BulkInsertQuery.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Doctrine\DBAL\Connection as DoctrineConnection;
21 use ‪TYPO3\CMS\Core\Database\Connection as Typo3Connection;
22 
36 {
40  protected ‪$columns;
41 
45  protected ‪$connection;
46 
50  protected ‪$table;
51 
55  protected ‪$parameters = [];
56 
60  protected ‪$types = [];
61 
65  protected ‪$values = [];
66 
75  public function ‪__construct(DoctrineConnection ‪$connection, string ‪$table, array ‪$columns = [])
76  {
77  $this->connection = ‪$connection;
78  $this->table = ‪$connection->quoteIdentifier(‪$table);
79  $this->columns = ‪$columns;
80  }
81 
85  public function ‪__toString(): string
86  {
87  return $this->‪getSQL();
88  }
89 
113  public function ‪addValues(array ‪$values, array ‪$types = [])
114  {
115  $valueSet = [];
116 
117  if (empty($this->columns)) {
118  foreach (‪$values as $index => $value) {
119  $this->parameters[] = $value;
120  $this->types[] = ‪$types[$index] ?? null;
121  $valueSet[] = '?';
122  }
123 
124  $this->values[] = $valueSet;
125 
126  return;
127  }
128 
129  foreach ($this->columns as $index => $column) {
130  $namedValue = isset(‪$values[$column]) || array_key_exists($column, ‪$values);
131  $positionalValue = isset(‪$values[$index]) || array_key_exists($index, ‪$values);
132 
133  if (!$namedValue && !$positionalValue) {
134  throw new \InvalidArgumentException(
135  sprintf('No value specified for column %s (index %d).', $column, $index),
136  1476049651
137  );
138  }
139 
140  if ($namedValue && $positionalValue && ‪$values[$column] !== ‪$values[$index]) {
141  throw new \InvalidArgumentException(
142  sprintf('Multiple values specified for column %s (index %d).', $column, $index),
143  1476049652
144  );
145  }
146 
147  $this->parameters[] = $namedValue ? ‪$values[$column] : ‪$values[$index];
148  $valueSet[] = '?';
149 
150  $namedType = isset(‪$types[$column]);
151  $positionalType = isset(‪$types[$index]);
152 
153  if ($namedType && $positionalType && ‪$types[$column] !== ‪$types[$index]) {
154  throw new \InvalidArgumentException(
155  sprintf('Multiple types specified for column %s (index %d).', $column, $index),
156  1476049653
157  );
158  }
159 
160  if ($namedType) {
161  $this->types[] = ‪$types[$column];
162 
163  continue;
164  }
165 
166  if ($positionalType) {
167  $this->types[] = ‪$types[$index];
168 
169  continue;
170  }
171 
172  $this->types[] = Typo3Connection::PARAM_STR;
173  }
174 
175  $this->values[] = $valueSet;
176  }
177 
186  public function ‪execute(): int
187  {
188  return $this->connection->executeStatement($this->‪getSQL(), $this->parameters, $this->types);
189  }
190 
194  public function ‪getParameters(): array
195  {
197  }
198 
202  public function ‪getParameterTypes(): array
203  {
204  return ‪$this->types;
205  }
206 
213  public function ‪getSQL(): string
214  {
215  if (empty($this->values)) {
216  throw new \LogicException(
217  'You need to add at least one set of values before generating the SQL.',
218  1476049702
219  );
220  }
221 
223  $columnList = '';
224 
225  if (!empty($this->columns)) {
226  $columnList = sprintf(
227  ' (%s)',
228  implode(
229  ', ',
230  array_map(
231  static function (string $column) use (‪$connection): string {
232  return ‪$connection->quoteIdentifier($column);
233  },
235  )
236  )
237  );
238  }
239 
240  return sprintf(
241  'INSERT INTO %s%s VALUES (%s)',
242  $this->table,
243  $columnList,
244  implode(
245  '), (',
246  array_map(
247  static function (array $valueSet): string {
248  return implode(', ', $valueSet);
249  },
251  )
252  )
253  );
254  }
255 }
‪TYPO3\CMS\Core\Database\Query\BulkInsertQuery\$columns
‪string[] $columns
Definition: BulkInsertQuery.php:39
‪TYPO3\CMS\Core\Database\Query\BulkInsertQuery\__toString
‪__toString()
Definition: BulkInsertQuery.php:79
‪TYPO3\CMS\Core\Database\Query\BulkInsertQuery\$table
‪string $table
Definition: BulkInsertQuery.php:47
‪TYPO3\CMS\Core\Database\Query\BulkInsertQuery\__construct
‪__construct(DoctrineConnection $connection, string $table, array $columns=[])
Definition: BulkInsertQuery.php:69
‪TYPO3\CMS\Core\Database\Query\BulkInsertQuery\execute
‪int execute()
Definition: BulkInsertQuery.php:180
‪TYPO3\CMS\Core\Database\Query\BulkInsertQuery\$values
‪array $values
Definition: BulkInsertQuery.php:59
‪TYPO3\CMS\Core\Database\Query\BulkInsertQuery\getParameters
‪getParameters()
Definition: BulkInsertQuery.php:188
‪TYPO3\CMS\Core\Database\Query\BulkInsertQuery\$parameters
‪array $parameters
Definition: BulkInsertQuery.php:51
‪TYPO3\CMS\Core\Database\Query\BulkInsertQuery\getSQL
‪getSQL()
Definition: BulkInsertQuery.php:207
‪TYPO3\CMS\Core\Database\Query\BulkInsertQuery\getParameterTypes
‪getParameterTypes()
Definition: BulkInsertQuery.php:196
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:41
‪TYPO3\CMS\Core\Database\Query
Definition: BulkInsertQuery.php:18
‪TYPO3\CMS\Core\Database\Query\BulkInsertQuery
Definition: BulkInsertQuery.php:36
‪TYPO3\CMS\Core\Database\Query\BulkInsertQuery\addValues
‪addValues(array $values, array $types=[])
Definition: BulkInsertQuery.php:107
‪TYPO3\CMS\Core\Database\Query\BulkInsertQuery\$types
‪array $types
Definition: BulkInsertQuery.php:55
‪TYPO3\CMS\Core\Database\Query\BulkInsertQuery\$connection
‪DoctrineConnection $connection
Definition: BulkInsertQuery.php:43