0 follower

Final Class Yiisoft\Db\Mysql\DMLQueryBuilder

InheritanceYiisoft\Db\Mysql\DMLQueryBuilder » Yiisoft\Db\QueryBuilder\AbstractDMLQueryBuilder

Implements a DML (Data Manipulation Language) SQL statements for MySQL, MariaDB.

Protected Methods

Hide inherited methods

Method Description Defined By
prepareInsertValues() Yiisoft\Db\Mysql\DMLQueryBuilder

Method Details

Hide inherited methods

insertReturningPks() public method

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.');
}

            
prepareInsertValues() protected method

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);
}

            
resetSequence() public method

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";
}

            
update() public method

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";
}

            
upsert() public method

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);
}

            
upsertReturning() public method

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);
}