Final Class Yiisoft\Db\Mysql\DMLQueryBuilder
| Inheritance | Yiisoft\Db\Mysql\DMLQueryBuilder » Yiisoft\Db\QueryBuilder\AbstractDMLQueryBuilder |
|---|
Implements a DML (Data Manipulation Language) SQL statements for MySQL, MariaDB.
Public Methods
Protected Methods
| Method | Description | Defined By |
|---|---|---|
| prepareInsertValues() | Yiisoft\Db\Mysql\DMLQueryBuilder |
Method Details
| public string insertReturningPks ( string $table, array|\Yiisoft\Db\Query\QueryInterface $columns, array &$params = [] ) | ||
| $table | string | |
| $columns | array|\Yiisoft\Db\Query\QueryInterface | |
| $params | array | |
| throws | \Yiisoft\Db\Exception\NotSupportedException | |
|---|---|---|
public function insertReturningPks(string $table, array|QueryInterface $columns, array &$params = []): string
{
throw new NotSupportedException(__METHOD__ . ' is not supported by MySQL.');
}
| protected array prepareInsertValues ( string $table, array|\Yiisoft\Db\Query\QueryInterface $columns, array $params = [] ) | ||
| $table | string | |
| $columns | array|\Yiisoft\Db\Query\QueryInterface | |
| $params | array | |
protected function prepareInsertValues(string $table, array|QueryInterface $columns, array $params = []): array
{
if (empty($columns)) {
return [[], [], 'VALUES ()', []];
}
return parent::prepareInsertValues($table, $columns, $params);
}
| public string resetSequence ( string $table, integer|string|null $value = null ) | ||
| $table | string | |
| $value | integer|string|null | |
public function resetSequence(string $table, int|string|null $value = null): string
{
$tableSchema = $this->schema->getTableSchema($table);
if ($tableSchema === null) {
throw new InvalidArgumentException("Table not found: '$table'.");
}
$sequenceName = $tableSchema->getSequenceName();
if ($sequenceName === null) {
throw new InvalidArgumentException("There is not sequence associated with table '$table'.");
}
$tableName = $this->quoter->quoteTableName($table);
if ($value !== null) {
return 'ALTER TABLE ' . $tableName . ' AUTO_INCREMENT=' . (string) $value . ';';
}
$key = $tableSchema->getPrimaryKey()[0];
return "SET @new_autoincrement_value := (SELECT MAX(`$key`) + 1 FROM $tableName);
@sql = CONCAT('ALTER TABLE $tableName AUTO_INCREMENT =', @new_autoincrement_value);
ARE autoincrement_stmt FROM @sql;
UTE autoincrement_stmt";
}
| public string update ( string $table, array $columns, array|\Yiisoft\Db\Expression\ExpressionInterface|string $condition, array|\Yiisoft\Db\Expression\ExpressionInterface|string|null $from = null, array &$params = [] ) | ||
| $table | string | |
| $columns | array | |
| $condition | array|\Yiisoft\Db\Expression\ExpressionInterface|string | |
| $from | array|\Yiisoft\Db\Expression\ExpressionInterface|string|null | |
| $params | array | |
public function update(
string $table,
array $columns,
array|ExpressionInterface|string $condition,
array|ExpressionInterface|string|null $from = null,
array &$params = [],
): string {
$sql = 'UPDATE ' . $this->quoter->quoteTableName($table);
if ($from !== null) {
$fromClause = $this->queryBuilder->buildFrom(DbArrayHelper::normalizeExpressions($from), $params);
$sql .= ', ' . substr($fromClause, 5);
$updateSets = $this->prepareUpdateSets($table, $columns, $params, useTableName: true);
} else {
$updateSets = $this->prepareUpdateSets($table, $columns, $params);
}
$sql .= ' SET ' . implode(', ', $updateSets);
$where = $this->queryBuilder->buildWhere($condition, $params);
return $where === '' ? $sql : "$sql $where";
}
| public string upsert ( string $table, array|\Yiisoft\Db\Query\QueryInterface $insertColumns, array|boolean $updateColumns = true, array &$params = [] ) | ||
| $table | string | |
| $insertColumns | array|\Yiisoft\Db\Query\QueryInterface | |
| $updateColumns | array|boolean | |
| $params | array | |
public function upsert(
string $table,
array|QueryInterface $insertColumns,
array|bool $updateColumns = true,
array &$params = [],
): string {
[$uniqueNames, , $updateNames] = $this->prepareUpsertColumns($table, $insertColumns, $updateColumns);
if (empty($uniqueNames)) {
return $this->insert($table, $insertColumns, $params);
}
if (empty($updateColumns) || $updateNames === []) {
/** there are no columns to update */
$insertSql = $this->insert($table, $insertColumns, $params);
return 'INSERT IGNORE' . substr($insertSql, 6);
}
[$names, $placeholders, $values, $params] = $this->prepareInsertValues($table, $insertColumns, $params);
$quotedNames = array_map($this->quoter->quoteColumnName(...), $names);
if (!empty($placeholders)) {
$values = $this->buildSimpleSelect(array_combine($names, $placeholders));
}
$fields = implode(', ', $quotedNames);
$insertSql = 'INSERT INTO ' . $this->quoter->quoteTableName($table)
. " ($fields) SELECT $fields FROM ($values) AS EXCLUDED";
$updates = $this->prepareUpsertSets($table, $updateColumns, $updateNames, $params);
return $insertSql . ' ON DUPLICATE KEY UPDATE ' . implode(', ', $updates);
}
| public string upsertReturning ( string $table, array|\Yiisoft\Db\Query\QueryInterface $insertColumns, array|boolean $updateColumns = true, array|null $returnColumns = null, array &$params = [] ) | ||
| $table | string | |
| $insertColumns | array|\Yiisoft\Db\Query\QueryInterface | |
| $updateColumns | array|boolean | |
| $returnColumns | array|null | |
| $params | array | |
public function upsertReturning(
string $table,
array|QueryInterface $insertColumns,
array|bool $updateColumns = true,
?array $returnColumns = null,
array &$params = [],
): string {
$tableSchema = $this->schema->getTableSchema($table);
$returnColumns ??= $tableSchema?->getColumnNames();
if (empty($returnColumns)) {
return $this->upsert($table, $insertColumns, $updateColumns, $params);
}
[$uniqueNames, $insertNames] = $this->prepareUpsertColumns($table, $insertColumns, $updateColumns);
/** @var TableSchema $tableSchema */
$primaryKeys = $tableSchema->getPrimaryKey();
$uniqueColumns = $primaryKeys ?: $uniqueNames;
if (is_array($insertColumns)) {
$insertColumns = array_combine($insertNames, $insertColumns);
}
if (empty($uniqueColumns)) {
$upsertSql = $this->upsert($table, $insertColumns, $updateColumns, $params);
$returnValues = $this->prepareColumnValues($tableSchema, $returnColumns, $insertColumns, $params);
return $upsertSql . ';' . $this->buildSimpleSelect($returnValues);
}
if (is_array($updateColumns)
&& !empty($uniqueUpdateValues = array_intersect_key($updateColumns, array_fill_keys($uniqueColumns, null)))
) {
if (!is_array($insertColumns)
|| $uniqueUpdateValues !== array_intersect_key($insertColumns, $uniqueUpdateValues)
) {
throw new NotSupportedException(
__METHOD__ . '() is not supported by MySQL when updating different primary key or unique values.',
);
}
$updateColumns = array_diff_key($updateColumns, $uniqueUpdateValues);
}
$quoter = $this->quoter;
$quotedTable = $quoter->quoteTableName($table);
$upsertSql = $this->upsert($table, $insertColumns, $updateColumns, $params);
$isAutoIncrement = count($primaryKeys) === 1 && $tableSchema->getColumn($primaryKeys[0])?->isAutoIncrement();
if ($isAutoIncrement) {
$id = $quoter->quoteSimpleColumnName($primaryKeys[0]);
$setLastInsertId = "$id=LAST_INSERT_ID($quotedTable.$id)";
if (str_starts_with($upsertSql, 'INSERT IGNORE INTO')) {
$upsertSql = 'INSERT' . substr($upsertSql, 13) . " ON DUPLICATE KEY UPDATE $setLastInsertId";
} elseif (str_contains($upsertSql, ' ON DUPLICATE KEY UPDATE ')) {
$upsertSql .= ", $setLastInsertId";
}
}
$uniqueValues = $this->prepareColumnValues($tableSchema, $uniqueColumns, $insertColumns, $params);
if (empty(array_diff($returnColumns, array_keys($uniqueValues)))) {
$selectValues = array_intersect_key($uniqueValues, array_fill_keys($returnColumns, null));
return $upsertSql . ';' . $this->buildSimpleSelect($selectValues);
}
$conditions = [];
foreach ($uniqueValues as $name => $value) {
if ($value === 'NULL') {
throw new NotSupportedException(
__METHOD__ . '() is not supported by MySQL when inserting `null` primary key or unique values.',
);
}
$conditions[] = $quoter->quoteSimpleColumnName($name) . ' = ' . $value;
}
$quotedReturnColumns = array_map($quoter->quoteSimpleColumnName(...), $returnColumns);
return $upsertSql
. ';SELECT ' . implode(', ', $quotedReturnColumns)
. ' FROM ' . $quotedTable
. ' WHERE ' . implode(' AND ', $conditions);
}
Signup or Login in order to comment.