0 follower

Class Yiisoft\Db\Schema\Quoter

InheritanceYiisoft\Db\Schema\Quoter
ImplementsYiisoft\Db\Schema\QuoterInterface

The Quoter is a class that's used to quote table and column names for use in SQL statements.

It provides a set of methods for quoting different types of names, such as table names, column names, and schema names.

The Quoter class is used by {@see \Yiisoft\Db\QueryBuilder\AbstractQueryBuilder} to quote names.

It's also used by {@see \Yiisoft\Db\Command\AbstractCommand} to quote names in SQL statements before passing them to database servers.

Method Details

Hide inherited methods

__construct() public method

public mixed __construct ( array|string $columnQuoteCharacter, array|string $tableQuoteCharacter, string $tablePrefix '' )
$columnQuoteCharacter array|string
$tableQuoteCharacter array|string
$tablePrefix string

                public function __construct(
    /** @psalm-var string[]|string */
    private array|string $columnQuoteCharacter,
    /** @psalm-var string[]|string */
    private array|string $tableQuoteCharacter,
    private string $tablePrefix = '',
) {}

            
cleanUpTableNames() public method

public array cleanUpTableNames ( array $tableNames )
$tableNames array

                public function cleanUpTableNames(array $tableNames): array
{
    $cleanedUpTableNames = [];
    $pattern = <<<PATTERN
    ~^\s*((?:['"`\[]|{{).*?(?:['"`\]]|}})|\(.*?\)|.*?)(?:\s+(?:as\s+)?((?:['"`\[]|{{).*?(?:['"`\]]|}})|.*?))?\s*$~iux
    PATTERN;
    /** @psalm-var array<array-key, ExpressionInterface|string> $tableNames */
    foreach ($tableNames as $alias => $tableName) {
        if (is_string($tableName) && !is_string($alias)) {
            if (preg_match($pattern, $tableName, $matches)) {
                if (isset($matches[2])) {
                    [, $tableName, $alias] = $matches;
                } else {
                    $tableName = $alias = $matches[1];
                }
            }
        }
        if (!is_string($alias)) {
            throw new InvalidArgumentException(
                'To use Expression in from() method, pass it in array format with alias.',
            );
        }
        if (is_string($tableName)) {
            $cleanedUpTableNames[$this->ensureNameQuoted($alias)] = $this->ensureNameQuoted($tableName);
        } elseif ($tableName instanceof ExpressionInterface) {
            $cleanedUpTableNames[$this->ensureNameQuoted($alias)] = $tableName;
        } else {
            throw new InvalidArgumentException(
                'Use ExpressionInterface without cast to string as object of tableName',
            );
        }
    }
    return $cleanedUpTableNames;
}

            
ensureColumnName() public method

public string ensureColumnName ( string $name )
$name string

                public function ensureColumnName(string $name): string
{
    if (($pos = strrpos($name, '.')) !== false) {
        $name = substr($name, $pos + 1);
    }
    /** @var string */
    return preg_replace('|^\[\[([\w\- ]+)]]$|', '\1', $name);
}

            
ensureNameQuoted() public method

public string ensureNameQuoted ( string $name )
$name string

                public function ensureNameQuoted(string $name): string
{
    $name = str_replace(["'", '"', '`', '[', ']'], '', $name);
    if (empty($name) || str_starts_with($name, '{{')) {
        return $name;
    }
    return '{{' . $name . '}}';
}

            
getRawTableName() public method

public string getRawTableName ( string $name )
$name string

                public function getRawTableName(string $name): string
{
    if (str_contains($name, '{{')) {
        /** @var string $name */
        $name = preg_replace('/{{(.*?)}}/', '\1', $name);
        return str_replace('%', $this->tablePrefix, $name);
    }
    return $name;
}

            
getTableNameParts() public method

public array getTableNameParts ( string $name )
$name string

                public function getTableNameParts(string $name): array
{
    $parts = array_reverse(array_slice(explode('.', $name), -2, 2));
    /** @var string[] */
    $parts = array_map($this->unquoteSimpleTableName(...), $parts);
    if (!isset($parts[1])) {
        return ['name' => $parts[0]];
    }
    return [
        'schemaName' => $parts[1],
        'name' => $parts[0],
    ];
}

            
quoteColumnName() public method

public string quoteColumnName ( string $name )
$name string

                public function quoteColumnName(string $name): string
{
    if (str_contains($name, '(') || str_contains($name, '[[')) {
        return $name;
    }
    if (($pos = strrpos($name, '.')) !== false) {
        $prefix = $this->quoteTableName(substr($name, 0, $pos)) . '.';
        $name = substr($name, $pos + 1);
    } else {
        $prefix = '';
    }
    if (str_contains($name, '{{')) {
        return $name;
    }
    return $prefix . $this->quoteSimpleColumnName($name);
}

            
quoteSimpleColumnName() public method

public string quoteSimpleColumnName ( string $name )
$name string

                public function quoteSimpleColumnName(string $name): string
{
    if ($name === '' || $name === '*') {
        return $name;
    }
    if (is_string($this->columnQuoteCharacter)) {
        $startingCharacter = $endingCharacter = $this->columnQuoteCharacter;
    } else {
        [$startingCharacter, $endingCharacter] = $this->columnQuoteCharacter;
    }
    return $name[0] === $startingCharacter
        ? $name
        : $startingCharacter . $name . $endingCharacter;
}

            
quoteSimpleTableName() public method

public string quoteSimpleTableName ( string $name )
$name string

                public function quoteSimpleTableName(string $name): string
{
    if (is_string($this->tableQuoteCharacter)) {
        $startingCharacter = $endingCharacter = $this->tableQuoteCharacter;
    } else {
        [$startingCharacter, $endingCharacter] = $this->tableQuoteCharacter;
    }
    return ($name[0] ?? '') === $startingCharacter
        ? $name
        : $startingCharacter . $name . $endingCharacter;
}

            
quoteSql() public method

public string quoteSql ( string $sql )
$sql string

                public function quoteSql(string $sql): string
{
    /** @var string */
    return preg_replace_callback(
        '/{{(%?[\w\-. ]+)%?}}|\\[\\[([\w\-. ]+)]]/',
        function ($matches) {
            if (isset($matches[2])) {
                return $this->quoteSimpleColumnName($matches[2]);
            }
            return str_replace('%', $this->tablePrefix, $this->quoteSimpleTableName($matches[1]));
        },
        $sql,
    );
}

            
quoteTableName() public method

public string quoteTableName ( string $name )
$name string

                public function quoteTableName(string $name): string
{
    if ($name[0] === '(' || str_contains($name, '{{')) {
        return $name;
    }
    if (!str_contains($name, '.')) {
        return $this->quoteSimpleTableName($name);
    }
    $parts = $this->getTableNameParts($name);
    foreach ($parts as &$part) {
        $part = $this->quoteSimpleTableName($part);
    }
    return implode('.', $parts);
}

            
quoteValue() public method

public string quoteValue ( string $value )
$value string

                public function quoteValue(string $value): string
{
    return "'" . str_replace("'", "''", addcslashes($value, "\000\032")) . "'";
}

            
setTablePrefix() public method

public void setTablePrefix ( string $value )
$value string

                public function setTablePrefix(string $value): void
{
    $this->tablePrefix = $value;
}

            
unquoteSimpleColumnName() public method

public string unquoteSimpleColumnName ( string $name )
$name string

                public function unquoteSimpleColumnName(string $name): string
{
    return ($name[0] ?? '') !== $this->columnQuoteCharacter[0]
        ? $name
        : substr($name, 1, -1);
}

            
unquoteSimpleTableName() public method

public string unquoteSimpleTableName ( string $name )
$name string

                public function unquoteSimpleTableName(string $name): string
{
    return ($name[0] ?? '') !== $this->tableQuoteCharacter[0]
        ? $name
        : substr($name, 1, -1);
}