类 yii\db\oci\QueryBuilder
继承关系 | yii\db\oci\QueryBuilder » yii\db\QueryBuilder » yii\base\BaseObject |
---|---|
实现 | yii\base\Configurable |
可用版本 | 2.0 |
源代码 | https://github.com/yiisoft/yii2/blob/master/framework/db/oci/QueryBuilder.php |
QueryBuilder 是用于 Oracle 数据库的查询构建器。
公共属性
属性 | 类型 | 描述 | 定义于 |
---|---|---|---|
$conditionBuilders | 数组 | 查询条件到构建器方法的映射。 | yii\db\QueryBuilder |
$conditionClasses | 数组 | 条件别名到条件类的映射。 | yii\db\QueryBuilder |
$db | yii\db\Connection | 数据库连接。 | yii\db\QueryBuilder |
$expressionBuilders | 字符串[]|yii\db\ExpressionBuilderInterface[] | 将表达式类映射到表达式构建器类。 | yii\db\QueryBuilder |
$separator | 字符串 | SQL 语句中不同片段之间的分隔符。 | yii\db\QueryBuilder |
$typeMap | 数组 | 从抽象列类型(键)到物理列类型(值)的映射。 | yii\db\oci\QueryBuilder |
公共方法
受保护的方法
方法 | 描述 | 定义于 |
---|---|---|
defaultConditionClasses() | 包含默认条件类的数组。如果要更改查询构建器的默认条件类,请扩展此方法。有关详细信息,请参阅 $conditionClasses 文档。 | yii\db\QueryBuilder |
defaultExpressionBuilders() | 包含默认表达式构建器的数组。如果要更改此查询构建器的默认表达式构建器,请扩展此方法并覆盖它。有关详细信息,请参阅 $expressionBuilders 文档。 | yii\db\oci\QueryBuilder |
extractAlias() | 如果存在,则提取表别名,否则返回 false | yii\db\QueryBuilder |
hasLimit() | 检查给定的限制是否有效。 | yii\db\QueryBuilder |
hasOffset() | 检查给定的偏移量是否有效。 | yii\db\QueryBuilder |
prepareInsertSelectSubQuery() | 为 INSERT INTO ... SELECT SQL 语句准备 select-subquery 和字段名称。 | yii\db\QueryBuilder |
prepareInsertValues() | 为 INSERT SQL 语句准备 VALUES 部分。 | yii\db\oci\QueryBuilder |
prepareUpdateSets() | 为 UPDATE SQL 语句准备 SET 部分。 | yii\db\QueryBuilder |
prepareUpsertColumns() | yii\db\QueryBuilder |
属性详细信息
从抽象列类型(键)到物理列类型(值)的映射。
\yii\db\oci\Schema::TYPE_PK => 'NUMBER(10) NOT NULL PRIMARY KEY',
\yii\db\oci\Schema::TYPE_UPK => 'NUMBER(10) UNSIGNED NOT NULL PRIMARY KEY',
\yii\db\oci\Schema::TYPE_BIGPK => 'NUMBER(20) NOT NULL PRIMARY KEY',
\yii\db\oci\Schema::TYPE_UBIGPK => 'NUMBER(20) UNSIGNED NOT NULL PRIMARY KEY',
\yii\db\oci\Schema::TYPE_CHAR => 'CHAR(1)',
\yii\db\oci\Schema::TYPE_STRING => 'VARCHAR2(255)',
\yii\db\oci\Schema::TYPE_TEXT => 'CLOB',
\yii\db\oci\Schema::TYPE_TINYINT => 'NUMBER(3)',
\yii\db\oci\Schema::TYPE_SMALLINT => 'NUMBER(5)',
\yii\db\oci\Schema::TYPE_INTEGER => 'NUMBER(10)',
\yii\db\oci\Schema::TYPE_BIGINT => 'NUMBER(20)',
\yii\db\oci\Schema::TYPE_FLOAT => 'NUMBER',
\yii\db\oci\Schema::TYPE_DOUBLE => 'NUMBER',
\yii\db\oci\Schema::TYPE_DECIMAL => 'NUMBER',
\yii\db\oci\Schema::TYPE_DATETIME => 'TIMESTAMP',
\yii\db\oci\Schema::TYPE_TIMESTAMP => 'TIMESTAMP',
\yii\db\oci\Schema::TYPE_TIME => 'TIMESTAMP',
\yii\db\oci\Schema::TYPE_DATE => 'DATE',
\yii\db\oci\Schema::TYPE_BINARY => 'BLOB',
\yii\db\oci\Schema::TYPE_BOOLEAN => 'NUMBER(1)',
\yii\db\oci\Schema::TYPE_MONEY => 'NUMBER(19,4)',
]
方法详细信息
public mixed __call ( $name, $params ) | ||
$name | 字符串 |
方法名称 |
$params | 数组 |
方法参数 |
返回值 | mixed |
方法返回值 |
---|---|---|
抛出 | yii\base\UnknownMethodException |
调用未知方法时 |
public function __call($name, $params)
{
throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
}
定义于: yii\db\QueryBuilder::__construct()
构造函数。
public void __construct ( $connection, $config = [] ) | ||
$connection | yii\db\Connection |
数据库连接。 |
$config | 数组 |
将用于初始化对象属性的名称-值对 |
public function __construct($connection, $config = [])
{
$this->db = $connection;
parent::__construct($config);
}
定义于: yii\base\BaseObject::__get()
返回对象属性的值。
不要直接调用此方法,因为它是一个 PHP 魔术方法,当执行 $value = $object->property;
时会隐式调用。
另请参阅 __set()。
public mixed __get ( $name ) | ||
$name | 字符串 |
属性名称 |
返回值 | mixed |
属性值 |
---|---|---|
抛出 | yii\base\UnknownPropertyException |
如果属性未定义 |
抛出 | yii\base\InvalidCallException |
如果属性是只写 |
public function __get($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
return $this->$getter();
} elseif (method_exists($this, 'set' . $name)) {
throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
}
throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
}
定义于: yii\base\BaseObject::__isset()
检查属性是否已设置,即定义且不为空。
不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行 isset($object->property)
时会被隐式调用。
注意,如果属性未定义,将返回 false。
public boolean __isset ( $name ) | ||
$name | 字符串 |
属性名称或事件名称 |
返回值 | boolean |
命名的属性是否设置(不为空)。 |
---|
public function __isset($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
return $this->$getter() !== null;
}
return false;
}
定义于: yii\base\BaseObject::__set()
设置对象属性的值。
不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行 $object->property = $value;
时会被隐式调用。
另请参阅 __get()。
public void __set ( $name, $value ) | ||
$name | 字符串 |
属性名称或事件名称 |
$value | mixed |
属性值 |
抛出 | yii\base\UnknownPropertyException |
如果属性未定义 |
---|---|---|
抛出 | yii\base\InvalidCallException |
如果属性是只读 |
public function __set($name, $value)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
$this->$setter($value);
} elseif (method_exists($this, 'get' . $name)) {
throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
} else {
throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
}
}
定义于: yii\base\BaseObject::__unset()
将对象属性设置为 null。
不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行 unset($object->property)
时会被隐式调用。
注意,如果属性未定义,此方法将不执行任何操作。如果属性是只读,它将抛出异常。
public void __unset ( $name ) | ||
$name | 字符串 |
属性名称 |
抛出 | yii\base\InvalidCallException |
如果属性是只读。 |
---|
public function __unset($name)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
$this->$setter(null);
} elseif (method_exists($this, 'get' . $name)) {
throw new InvalidCallException('Unsetting read-only property: ' . get_class($this) . '::' . $name);
}
}
定义于: yii\db\QueryBuilder::addCheck()
创建一个 SQL 命令,用于向现有表添加检查约束。
public string addCheck ( $name, $table, $expression ) | ||
$name | 字符串 |
检查约束的名称。名称将由方法正确引用。 |
$table | 字符串 |
将添加检查约束的表。名称将由方法正确引用。 |
$expression | 字符串 |
|
返回值 | 字符串 |
将检查约束添加到现有表的 SQL 语句。 |
---|
public function addCheck($name, $table, $expression)
{
return 'ALTER TABLE ' . $this->db->quoteTableName($table) . ' ADD CONSTRAINT '
. $this->db->quoteColumnName($name) . ' CHECK (' . $this->db->quoteSql($expression) . ')';
}
定义于: yii\db\QueryBuilder::addColumn()
构建一个 SQL 语句,用于添加新的数据库列。
public string addColumn ( $table, $column, $type ) | ||
$table | 字符串 |
将添加新列的表。表名将由方法正确引用。 |
$column | 字符串 |
新列的名称。名称将由方法正确引用。 |
$type | 字符串 |
列类型。将调用 getColumnType() 方法将抽象列类型(如果有)转换为物理列类型。任何未识别为抽象类型的类型都将保留在生成的 SQL 中。例如,'string' 将变为 'varchar(255)',而 'string not null' 将变为 'varchar(255) not null'。 |
返回值 | 字符串 |
添加新列的 SQL 语句。 |
---|
public function addColumn($table, $column, $type)
{
return 'ALTER TABLE ' . $this->db->quoteTableName($table)
. ' ADD ' . $this->db->quoteColumnName($column) . ' '
. $this->getColumnType($type);
}
定义于: yii\db\QueryBuilder::addCommentOnColumn()
构建一个 SQL 命令,用于向列添加注释。
public string addCommentOnColumn ( $table, $column, $comment ) | ||
$table | 字符串 |
要对其列进行注释的表。表名将由方法正确引用。 |
$column | 字符串 |
要进行注释的列的名称。列名将由方法正确引用。 |
$comment | 字符串 |
要添加的注释的文本。注释将由方法正确引用。 |
返回值 | 字符串 |
在列上添加注释的 SQL 语句 |
---|
public function addCommentOnColumn($table, $column, $comment)
{
return 'COMMENT ON COLUMN ' . $this->db->quoteTableName($table) . '.' . $this->db->quoteColumnName($column) . ' IS ' . $this->db->quoteValue($comment);
}
定义于: yii\db\QueryBuilder::addCommentOnTable()
构建一个 SQL 命令,用于向表添加注释。
public string addCommentOnTable ( $table, $comment ) | ||
$table | 字符串 |
要对其列进行注释的表。表名将由方法正确引用。 |
$comment | 字符串 |
要添加的注释的文本。注释将由方法正确引用。 |
返回值 | 字符串 |
在表上添加注释的 SQL 语句 |
---|
public function addCommentOnTable($table, $comment)
{
return 'COMMENT ON TABLE ' . $this->db->quoteTableName($table) . ' IS ' . $this->db->quoteValue($comment);
}
定义于: yii\db\QueryBuilder::addDefaultValue()
创建一个 SQL 命令,用于向现有表添加默认值约束。
public string addDefaultValue ( $name, $table, $column, $value ) | ||
$name | 字符串 |
默认值约束的名称。名称将由方法正确引用。 |
$table | 字符串 |
将添加默认值约束的表。名称将由方法正确引用。 |
$column | 字符串 |
要添加约束的列的名称。名称将由方法正确引用。 |
$value | mixed |
默认值。 |
返回值 | 字符串 |
将默认值约束添加到现有表的 SQL 语句。 |
---|---|---|
抛出 | yii\base\NotSupportedException |
如果底层 DBMS 不支持此功能。 |
public function addDefaultValue($name, $table, $column, $value)
{
throw new NotSupportedException($this->db->getDriverName() . ' does not support adding default value constraints.');
}
构建一个 SQL 语句,用于向现有表添加外键约束。
该方法将正确引用表和列名。
public string addForeignKey ( $name, $table, $columns, $refTable, $refColumns, $delete = null, $update = null ) | ||
$name | 字符串 |
外键约束的名称。 |
$table | 字符串 |
将添加外键约束的表。 |
$columns | string|array |
要添加约束的列的名称。如果有多个列,请用逗号分隔或使用数组来表示它们。 |
$refTable | 字符串 |
外键引用的表。 |
$refColumns | string|array |
外键引用的列名。 如果有多个列,则用逗号分隔或使用数组来表示它们。 |
$delete | string|null |
ON DELETE 选项。 大多数 DBMS 支持以下选项:RESTRICT、CASCADE、NO ACTION、SET DEFAULT、SET NULL |
$update | string|null |
ON UPDATE 选项。 大多数 DBMS 支持以下选项:RESTRICT、CASCADE、NO ACTION、SET DEFAULT、SET NULL |
返回值 | 字符串 |
向现有表添加外键约束的 SQL 语句。 |
---|
public function addForeignKey($name, $table, $columns, $refTable, $refColumns, $delete = null, $update = null)
{
$sql = 'ALTER TABLE ' . $this->db->quoteTableName($table)
. ' ADD CONSTRAINT ' . $this->db->quoteColumnName($name)
. ' FOREIGN KEY (' . $this->buildColumns($columns) . ')'
. ' REFERENCES ' . $this->db->quoteTableName($refTable)
. ' (' . $this->buildColumns($refColumns) . ')';
if ($delete !== null) {
$sql .= ' ON DELETE ' . $delete;
}
if ($update !== null) {
throw new Exception('Oracle does not support ON UPDATE clause.');
}
return $sql;
}
定义于: yii\db\QueryBuilder::addPrimaryKey()
构建一个 SQL 语句,用于向现有表添加主键约束。
public string addPrimaryKey ( $name, $table, $columns ) | ||
$name | 字符串 |
主键约束的名称。 |
$table | 字符串 |
将添加主键约束的表。 |
$columns | string|array |
主键将由其组成的列的逗号分隔字符串或数组。 |
返回值 | 字符串 |
向现有表添加主键约束的 SQL 语句。 |
---|
public function addPrimaryKey($name, $table, $columns)
{
if (is_string($columns)) {
$columns = preg_split('/\s*,\s*/', $columns, -1, PREG_SPLIT_NO_EMPTY);
}
foreach ($columns as $i => $col) {
$columns[$i] = $this->db->quoteColumnName($col);
}
return 'ALTER TABLE ' . $this->db->quoteTableName($table) . ' ADD CONSTRAINT '
. $this->db->quoteColumnName($name) . ' PRIMARY KEY ('
. implode(', ', $columns) . ')';
}
定义于: yii\db\QueryBuilder::addUnique()
创建一个 SQL 命令,用于向现有表添加唯一约束。
public string addUnique ( $name, $table, $columns ) | ||
$name | 字符串 |
唯一约束的名称。 该名称将由该方法正确引用。 |
$table | 字符串 |
将添加唯一约束的表。 该名称将由该方法正确引用。 |
$columns | string|array |
将添加约束的列的名称。 如果有多个列,则用逗号分隔。 该名称将由该方法正确引用。 |
返回值 | 字符串 |
向现有表添加唯一约束的 SQL 语句。 |
---|
public function addUnique($name, $table, $columns)
{
if (is_string($columns)) {
$columns = preg_split('/\s*,\s*/', $columns, -1, PREG_SPLIT_NO_EMPTY);
}
foreach ($columns as $i => $col) {
$columns[$i] = $this->db->quoteColumnName($col);
}
return 'ALTER TABLE ' . $this->db->quoteTableName($table) . ' ADD CONSTRAINT '
. $this->db->quoteColumnName($name) . ' UNIQUE ('
. implode(', ', $columns) . ')';
}
构建一个 SQL 语句,用于更改列的定义。
public string alterColumn ( $table, $column, $type ) | ||
$table | 字符串 |
要更改其列的表。 该表名将由该方法正确引用。 |
$column | 字符串 |
要更改的列的名称。 该名称将由该方法正确引用。 |
$type | 字符串 |
新的列类型。 getColumnType() 方法将被调用以将抽象列类型(如果有)转换为物理类型。 任何不被识别为抽象类型的类型都将保留在生成的 SQL 中。 例如,'string' 将转换为 'varchar(255)',而 'string not null' 将变为 'varchar(255) not null'。 |
返回值 | 字符串 |
更改列定义的 SQL 语句。 |
---|
public function alterColumn($table, $column, $type)
{
$type = $this->getColumnType($type);
return 'ALTER TABLE ' . $this->db->quoteTableName($table) . ' MODIFY ' . $this->db->quoteColumnName($column) . ' ' . $this->getColumnType($type);
}
生成一个批量 INSERT SQL 语句。
例如,
$sql = $queryBuilder->batchInsert('user', ['name', 'age'], [
['Tom', 30],
['Jane', 20],
['Linda', 25],
]);
请注意,每行中的值必须与相应的列名匹配。
public string batchInsert ( $table, $columns, $rows, &$params = [] ) | ||
$table | 字符串 |
将插入新行的表。 |
$columns | 数组 |
列名 |
$rows | array|Generator |
要批量插入到表中的行 |
$params | ||
返回值 | 字符串 |
批量 INSERT SQL 语句 |
---|
public function batchInsert($table, $columns, $rows, &$params = [])
{
if (empty($rows)) {
return '';
}
$schema = $this->db->getSchema();
if (($tableSchema = $schema->getTableSchema($table)) !== null) {
$columnSchemas = $tableSchema->columns;
} else {
$columnSchemas = [];
}
$values = [];
foreach ($rows as $row) {
$vs = [];
foreach ($row as $i => $value) {
if (isset($columns[$i], $columnSchemas[$columns[$i]])) {
$value = $columnSchemas[$columns[$i]]->dbTypecast($value);
}
if (is_string($value)) {
$value = $schema->quoteValue($value);
} elseif (is_float($value)) {
// ensure type cast always has . as decimal separator in all locales
$value = StringHelper::floatToString($value);
} elseif ($value === false) {
$value = 0;
} elseif ($value === null) {
$value = 'NULL';
} elseif ($value instanceof ExpressionInterface) {
$value = $this->buildExpression($value, $params);
}
$vs[] = $value;
}
$values[] = '(' . implode(', ', $vs) . ')';
}
if (empty($values)) {
return '';
}
foreach ($columns as $i => $name) {
$columns[$i] = $schema->quoteColumnName($name);
}
$tableAndColumns = ' INTO ' . $schema->quoteTableName($table)
. ' (' . implode(', ', $columns) . ') VALUES ';
return 'INSERT ALL ' . $tableAndColumns . implode($tableAndColumns, $values) . ' SELECT 1 FROM SYS.DUAL';
}
定义于: yii\db\QueryBuilder::bindParam()
辅助方法,使用 PARAM_PREFIX 将 $value 添加到 $params 数组中。
public string bindParam ( $value, &$params ) | ||
$value | string|null | |
$params | 数组 |
按引用传递 |
返回值 | 字符串 |
$params 数组中的占位符名称 |
---|
public function bindParam($value, &$params)
{
$phName = self::PARAM_PREFIX . count($params);
$params[$phName] = $value;
return $phName;
}
定义于: yii\db\QueryBuilder::build()
从 yii\db\Query 对象生成 SELECT SQL 语句。
public array build ( $query, $params = [] ) | ||
$query | yii\db\Query |
将从中生成 SQL 语句的 yii\db\Query 对象。 |
$params | 数组 |
要绑定到生成的 SQL 语句的参数。 这些参数将与在查询构建过程中生成的额外参数一起包含在结果中。 |
返回值 | 数组 |
生成的 SQL 语句(第一个数组元素)以及要绑定到 SQL 语句的相应参数(第二个数组元素)。 返回的参数包括在 |
---|
public function build($query, $params = [])
{
$query = $query->prepare($this);
$params = empty($params) ? $query->params : array_merge($params, $query->params);
$clauses = [
$this->buildSelect($query->select, $params, $query->distinct, $query->selectOption),
$this->buildFrom($query->from, $params),
$this->buildJoin($query->join, $params),
$this->buildWhere($query->where, $params),
$this->buildGroupBy($query->groupBy),
$this->buildHaving($query->having, $params),
];
$sql = implode($this->separator, array_filter($clauses));
$sql = $this->buildOrderByAndLimit($sql, $query->orderBy, $query->limit, $query->offset);
if (!empty($query->orderBy)) {
foreach ($query->orderBy as $expression) {
if ($expression instanceof ExpressionInterface) {
$this->buildExpression($expression, $params);
}
}
}
if (!empty($query->groupBy)) {
foreach ($query->groupBy as $expression) {
if ($expression instanceof ExpressionInterface) {
$this->buildExpression($expression, $params);
}
}
}
$union = $this->buildUnion($query->union, $params);
if ($union !== '') {
$sql = "($sql){$this->separator}$union";
}
$with = $this->buildWithQueries($query->withQueries, $params);
if ($with !== '') {
$sql = "$with{$this->separator}$sql";
}
return [$sql, $params];
}
buildCondition()
代替。
定义于: yii\db\QueryBuilder::buildAndCondition()
使用 AND
或 OR
运算符连接两个或多个 SQL 表达式。
public string buildAndCondition ( $operator, $operands, &$params ) | ||
$operator | 字符串 |
用于连接给定操作数的操作符 |
$operands | 数组 |
要连接的 SQL 表达式。 |
$params | 数组 |
要填充的绑定参数 |
返回值 | 字符串 |
生成的 SQL 表达式 |
---|
public function buildAndCondition($operator, $operands, &$params)
{
array_unshift($operands, $operator);
return $this->buildCondition($operands, $params);
}
buildCondition()
代替。
定义于: yii\db\QueryBuilder::buildBetweenCondition()
使用 BETWEEN
运算符创建 SQL 表达式。
public string buildBetweenCondition ( $operator, $operands, &$params ) | ||
$operator | 字符串 |
要使用的操作符(例如 |
$operands | 数组 |
第一个操作数是列名。 第二个和第三个操作数描述了列值应该在其中的区间。 |
$params | 数组 |
要填充的绑定参数 |
返回值 | 字符串 |
生成的 SQL 表达式 |
---|---|---|
抛出 | yii\base\InvalidArgumentException |
如果给出了错误数量的操作数。 |
public function buildBetweenCondition($operator, $operands, &$params)
{
array_unshift($operands, $operator);
return $this->buildCondition($operands, $params);
}
public string buildColumns ( $columns ) | ||
$columns | string|array |
要处理的列 |
返回值 | 字符串 |
处理结果 |
---|
public function buildColumns($columns)
{
if (!is_array($columns)) {
if (strpos($columns, '(') !== false) {
return $columns;
}
$rawColumns = $columns;
$columns = preg_split('/\s*,\s*/', $columns, -1, PREG_SPLIT_NO_EMPTY);
if ($columns === false) {
throw new InvalidArgumentException("$rawColumns is not valid columns.");
}
}
foreach ($columns as $i => $column) {
if ($column instanceof ExpressionInterface) {
$columns[$i] = $this->buildExpression($column);
} elseif (strpos($column, '(') === false) {
$columns[$i] = $this->db->quoteColumnName($column);
}
}
return implode(', ', $columns);
}
定义于: yii\db\QueryBuilder::buildCondition()
解析条件规范并生成相应的 SQL 表达式。
public string buildCondition ( $condition, &$params ) | ||
$condition | string|array|yii\db\ExpressionInterface |
条件说明。请参考 yii\db\Query::where() 关于如何指定条件。 |
$params | 数组 |
要填充的绑定参数 |
返回值 | 字符串 |
生成的 SQL 表达式 |
---|
public function buildCondition($condition, &$params)
{
if (is_array($condition)) {
if (empty($condition)) {
return '';
}
$condition = $this->createConditionFromArray($condition);
}
if ($condition instanceof ExpressionInterface) {
return $this->buildExpression($condition, $params);
}
return (string)$condition;
}
buildCondition()
代替。
定义于: yii\db\QueryBuilder::buildExistsCondition()
使用 EXISTS
运算符创建 SQL 表达式。
public string buildExistsCondition ( $operator, $operands, &$params ) | ||
$operator | 字符串 |
要使用的运算符(例如 |
$operands | 数组 |
仅包含一个元素,该元素是 yii\db\Query 对象,表示子查询。 |
$params | 数组 |
要填充的绑定参数 |
返回值 | 字符串 |
生成的 SQL 表达式 |
---|---|---|
抛出 | yii\base\InvalidArgumentException |
如果操作数不是 yii\db\Query 对象。 |
public function buildExistsCondition($operator, $operands, &$params)
{
array_unshift($operands, $operator);
return $this->buildCondition($operands, $params);
}
public string buildExpression ( yii\db\ExpressionInterface $expression, &$params = [] ) | ||
$expression | yii\db\ExpressionInterface |
要构建的表达式 |
$params | 数组 |
要绑定到生成的 SQL 语句的参数。这些参数将与表达式构建过程中生成的附加参数一起包含在结果中。 |
返回值 | 字符串 |
SQL 语句,在传递到 DBMS 之前不会被引用或编码 |
---|---|---|
抛出 | yii\base\InvalidArgumentException |
当此 QueryBuilder 不支持 $expression 构建时。 |
public function buildExpression(ExpressionInterface $expression, &$params = [])
{
$builder = $this->getExpressionBuilder($expression);
return $builder->build($expression, $params);
}
public string buildFrom ( $tables, &$params ) | ||
$tables | 数组 | |
$params | 数组 |
要填充的绑定参数 |
返回值 | 字符串 |
从 yii\db\Query::$from 构建的 FROM 子句。 |
---|
public function buildFrom($tables, &$params)
{
if (empty($tables)) {
return '';
}
$tables = $this->quoteTableNames($tables, $params);
return 'FROM ' . implode(', ', $tables);
}
public string buildGroupBy ( $columns ) | ||
$columns | 数组 | |
返回值 | 字符串 |
GROUP BY 子句 |
---|
public function buildGroupBy($columns)
{
if (empty($columns)) {
return '';
}
foreach ($columns as $i => $column) {
if ($column instanceof ExpressionInterface) {
$columns[$i] = $this->buildExpression($column);
} elseif (strpos($column, '(') === false) {
$columns[$i] = $this->db->quoteColumnName($column);
}
}
return 'GROUP BY ' . implode(', ', $columns);
}
buildCondition()
代替。
定义于: yii\db\QueryBuilder::buildHashCondition()
根据列-值对创建条件。
public string buildHashCondition ( $condition, &$params ) | ||
$condition | 数组 |
条件说明。 |
$params | 数组 |
要填充的绑定参数 |
返回值 | 字符串 |
生成的 SQL 表达式 |
---|
public function buildHashCondition($condition, &$params)
{
return $this->buildCondition(new HashCondition($condition), $params);
}
public string buildHaving ( $condition, &$params ) | ||
$condition | string|array | |
$params | 数组 |
要填充的绑定参数 |
返回值 | 字符串 |
从 yii\db\Query::$having 构建的 HAVING 子句。 |
---|
public function buildHaving($condition, &$params)
{
$having = $this->buildCondition($condition, $params);
return $having === '' ? '' : 'HAVING ' . $having;
}
buildCondition()
代替。
定义于: yii\db\QueryBuilder::buildInCondition()
使用 IN
运算符创建 SQL 表达式。
public string buildInCondition ( $operator, $operands, &$params ) | ||
$operator | 字符串 |
要使用的运算符(例如 |
$operands | 数组 |
第一个操作数是列名。如果它是一个数组,将生成一个复合 IN 条件。第二个操作数是一个值的数组,列值应该在其中。如果它是一个空数组,如果运算符是 |
$params | 数组 |
要填充的绑定参数 |
返回值 | 字符串 |
生成的 SQL 表达式 |
---|---|---|
抛出 | yii\db\Exception |
如果给出了错误数量的操作数。 |
public function buildInCondition($operator, $operands, &$params)
{
array_unshift($operands, $operator);
return $this->buildCondition($operands, $params);
}
public string buildJoin ( $joins, &$params ) | ||
$joins | 数组 | |
$params | 数组 |
要填充的绑定参数 |
返回值 | 字符串 |
从 yii\db\Query::$join 构建的 JOIN 子句。 |
---|---|---|
抛出 | yii\db\Exception |
如果 $joins 参数格式不正确 |
public function buildJoin($joins, &$params)
{
if (empty($joins)) {
return '';
}
foreach ($joins as $i => $join) {
if (!is_array($join) || !isset($join[0], $join[1])) {
throw new Exception('A join clause must be specified as an array of join type, join table, and optionally join condition.');
}
// 0:join type, 1:join table, 2:on-condition (optional)
list($joinType, $table) = $join;
$tables = $this->quoteTableNames((array)$table, $params);
$table = reset($tables);
$joins[$i] = "$joinType $table";
if (isset($join[2])) {
$condition = $this->buildCondition($join[2], $params);
if ($condition !== '') {
$joins[$i] .= ' ON ' . $condition;
}
}
}
return implode($this->separator, $joins);
}
buildCondition()
代替。
定义于: yii\db\QueryBuilder::buildLikeCondition()
使用 LIKE
运算符创建 SQL 表达式。
public string buildLikeCondition ( $operator, $operands, &$params ) | ||
$operator | 字符串 |
要使用的运算符(例如 |
$operands | 数组 |
两个或三个操作数的数组
|
$params | 数组 |
要填充的绑定参数 |
返回值 | 字符串 |
生成的 SQL 表达式 |
---|---|---|
抛出 | yii\base\InvalidArgumentException |
如果给出了错误数量的操作数。 |
public function buildLikeCondition($operator, $operands, &$params)
{
array_unshift($operands, $operator);
return $this->buildCondition($operands, $params);
}
public string buildLimit ( $limit, $offset ) | ||
$limit | integer | |
$offset | integer | |
返回值 | 字符串 |
LIMIT 和 OFFSET 子句 |
---|
public function buildLimit($limit, $offset)
{
$sql = '';
if ($this->hasLimit($limit)) {
$sql = 'LIMIT ' . $limit;
}
if ($this->hasOffset($offset)) {
$sql .= ' OFFSET ' . $offset;
}
return ltrim($sql);
}
buildCondition()
代替。
定义在: yii\db\QueryBuilder::buildNotCondition()
使用 NOT
运算符反转 SQL 表达式。
public string buildNotCondition ( $operator, $operands, &$params ) | ||
$operator | 字符串 |
用于连接给定操作数的操作符 |
$operands | 数组 |
要连接的 SQL 表达式。 |
$params | 数组 |
要填充的绑定参数 |
返回值 | 字符串 |
生成的 SQL 表达式 |
---|---|---|
抛出 | yii\base\InvalidArgumentException |
如果给出了错误数量的操作数。 |
public function buildNotCondition($operator, $operands, &$params)
{
array_unshift($operands, $operator);
return $this->buildCondition($operands, $params);
}
public string buildOrderBy ( $columns ) | ||
$columns | 数组 | |
返回值 | 字符串 |
从 yii\db\Query::$orderBy 生成的 ORDER BY 子句。 |
---|
public function buildOrderBy($columns)
{
if (empty($columns)) {
return '';
}
$orders = [];
foreach ($columns as $name => $direction) {
if ($direction instanceof ExpressionInterface) {
$orders[] = $this->buildExpression($direction);
} else {
$orders[] = $this->db->quoteColumnName($name) . ($direction === SORT_DESC ? ' DESC' : '');
}
}
return 'ORDER BY ' . implode(', ', $orders);
}
构建 ORDER BY 和 LIMIT/OFFSET 子句,并将它们附加到给定的 SQL 中。
public string buildOrderByAndLimit ( $sql, $orderBy, $limit, $offset ) | ||
$sql | 字符串 |
现有的 SQL(不包括 ORDER BY/LIMIT/OFFSET) |
$orderBy | 数组 |
排序列。有关如何指定此参数的更多详细信息,请参阅 yii\db\Query::orderBy()。 |
$limit | integer |
限制数量。有关更多详细信息,请参阅 yii\db\Query::limit()。 |
$offset | integer |
偏移数量。有关更多详细信息,请参阅 yii\db\Query::offset()。 |
返回值 | 字符串 |
完成的 SQL,包含 ORDER BY/LIMIT/OFFSET(如果有) |
---|
public function buildOrderByAndLimit($sql, $orderBy, $limit, $offset)
{
$orderBy = $this->buildOrderBy($orderBy);
if ($orderBy !== '') {
$sql .= $this->separator . $orderBy;
}
$filters = [];
if ($this->hasOffset($offset)) {
$filters[] = 'rowNumId > ' . $offset;
}
if ($this->hasLimit($limit)) {
$filters[] = 'rownum <= ' . $limit;
}
if (empty($filters)) {
return $sql;
}
$filter = implode(' AND ', $filters);
return <<<EOD
USER_SQL AS ($sql),
PAGINATION AS (SELECT USER_SQL.*, rownum as rowNumId FROM USER_SQL)
CT *
PAGINATION
E $filter
}
public string buildSelect ( $columns, &$params, $distinct = false, $selectOption = null ) | ||
$columns | 数组 | |
$params | 数组 |
要填充的绑定参数 |
$distinct | boolean | |
$selectOption | string|null | |
返回值 | 字符串 |
从 yii\db\Query::$select 生成的 SELECT 子句。 |
---|
public function buildSelect($columns, &$params, $distinct = false, $selectOption = null)
{
$select = $distinct ? 'SELECT DISTINCT' : 'SELECT';
if ($selectOption !== null) {
$select .= ' ' . $selectOption;
}
if (empty($columns)) {
return $select . ' *';
}
foreach ($columns as $i => $column) {
if ($column instanceof ExpressionInterface) {
if (is_int($i)) {
$columns[$i] = $this->buildExpression($column, $params);
} else {
$columns[$i] = $this->buildExpression($column, $params) . ' AS ' . $this->db->quoteColumnName($i);
}
} elseif ($column instanceof Query) {
list($sql, $params) = $this->build($column, $params);
$columns[$i] = "($sql) AS " . $this->db->quoteColumnName($i);
} elseif (is_string($i) && $i !== $column) {
if (strpos($column, '(') === false) {
$column = $this->db->quoteColumnName($column);
}
$columns[$i] = "$column AS " . $this->db->quoteColumnName($i);
} elseif (strpos($column, '(') === false) {
if (preg_match('/^(.*?)(?i:\s+as\s+|\s+)([\w\-_\.]+)$/', $column, $matches)) {
$columns[$i] = $this->db->quoteColumnName($matches[1]) . ' AS ' . $this->db->quoteColumnName($matches[2]);
} else {
$columns[$i] = $this->db->quoteColumnName($column);
}
}
}
return $select . ' ' . implode(', ', $columns);
}
buildCondition()
代替。
定义在: yii\db\QueryBuilder::buildSimpleCondition()
创建像 "column" operator value
这样的 SQL 表达式。
public string buildSimpleCondition ( $operator, $operands, &$params ) | ||
$operator | 字符串 |
要使用的运算符。可以使用任何内容,例如 |
$operands | 数组 |
包含两个列名。 |
$params | 数组 |
要填充的绑定参数 |
返回值 | 字符串 |
生成的 SQL 表达式 |
---|---|---|
抛出 | yii\base\InvalidArgumentException |
如果给出了错误数量的操作数。 |
public function buildSimpleCondition($operator, $operands, &$params)
{
array_unshift($operands, $operator);
return $this->buildCondition($operands, $params);
}
public string buildUnion ( $unions, &$params ) | ||
$unions | 数组 | |
$params | 数组 |
要填充的绑定参数 |
返回值 | 字符串 |
从 yii\db\Query::$union 生成的 UNION 子句。 |
---|
public function buildUnion($unions, &$params)
{
if (empty($unions)) {
return '';
}
$result = '';
foreach ($unions as $i => $union) {
$query = $union['query'];
if ($query instanceof Query) {
list($unions[$i]['query'], $params) = $this->build($query, $params);
}
$result .= 'UNION ' . ($union['all'] ? 'ALL ' : '') . '( ' . $unions[$i]['query'] . ' ) ';
}
return trim($result);
}
public string buildWhere ( $condition, &$params ) | ||
$condition | string|array | |
$params | 数组 |
要填充的绑定参数 |
返回值 | 字符串 |
从 yii\db\Query::$where 生成的 WHERE 子句。 |
---|
public function buildWhere($condition, &$params)
{
$where = $this->buildCondition($condition, $params);
return $where === '' ? '' : 'WHERE ' . $where;
}
public string buildWithQueries ( $withs, &$params ) | ||
$withs | 数组 |
每个 WITH 查询的配置 |
$params | 数组 |
要填充的绑定参数 |
返回值 | 字符串 |
包含嵌套查询的已编译 WITH 查询前缀 |
---|
public function buildWithQueries($withs, &$params)
{
if (empty($withs)) {
return '';
}
$recursive = false;
$result = [];
foreach ($withs as $i => $with) {
if ($with['recursive']) {
$recursive = true;
}
$query = $with['query'];
if ($query instanceof Query) {
list($with['query'], $params) = $this->build($query, $params);
}
$result[] = $with['alias'] . ' AS (' . $with['query'] . ')';
}
return 'WITH ' . ($recursive ? 'RECURSIVE ' : '') . implode(', ', $result);
}
定义在: yii\base\BaseObject::canGetProperty()
返回一个值,指示是否可以读取属性。
如果属性可读,则
- 该类具有与指定名称关联的 getter 方法(在这种情况下,属性名称不区分大小写);
- 该类具有与指定名称匹配的成员变量(当
$checkVars
为真时);
另请参阅 canSetProperty()。
public boolean canGetProperty ( $name, $checkVars = true ) | ||
$name | 字符串 |
属性名称 |
$checkVars | boolean |
是否将成员变量视为属性 |
返回值 | boolean |
属性是否可读 |
---|
public function canGetProperty($name, $checkVars = true)
{
return method_exists($this, 'get' . $name) || $checkVars && property_exists($this, $name);
}
定义在: yii\base\BaseObject::canSetProperty()
返回一个值,指示是否可以设置属性。
如果属性可写,则
- 该类具有与指定名称关联的 setter 方法(在这种情况下,属性名称不区分大小写);
- 该类具有与指定名称匹配的成员变量(当
$checkVars
为真时);
另请参阅 canGetProperty()。
public boolean canSetProperty ( $name, $checkVars = true ) | ||
$name | 字符串 |
属性名称 |
$checkVars | boolean |
是否将成员变量视为属性 |
返回值 | boolean |
属性是否可写 |
---|
public function canSetProperty($name, $checkVars = true)
{
return method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name);
}
定义在: yii\db\QueryBuilder::checkIntegrity()
构建一个 SQL 语句,用于启用或禁用完整性检查。
public string checkIntegrity ( $check = true, $schema = '', $table = '' ) | ||
$check | boolean |
是否启用或禁用完整性检查。 |
$schema | 字符串 |
表的模式。默认为空字符串,表示当前或默认模式。 |
$table | 字符串 |
表名。默认为空字符串,表示不更改任何表。 |
返回值 | 字符串 |
用于检查完整性的 SQL 语句 |
---|---|---|
抛出 | yii\base\NotSupportedException |
如果底层 DBMS 不支持此功能 |
public function checkIntegrity($check = true, $schema = '', $table = '')
{
throw new NotSupportedException($this->db->getDriverName() . ' does not support enabling/disabling integrity check.');
}
::class
代替。
定义于: yii\base\BaseObject::className()
返回此类的完全限定名。
public static string className ( ) | ||
返回值 | 字符串 |
此类的完全限定名称。 |
---|
public static function className()
{
return get_called_class();
}
定义于: yii\db\QueryBuilder::createConditionFromArray()
将以数组格式定义的 $condition(如 yii\db\Query::where() 中所述)转换为 yii\db\condition\ConditionInterface 的实例,根据 $conditionClasses 映射。
另请参见 $conditionClasses.
public yii\db\conditions\ConditionInterface createConditionFromArray ( $condition ) | ||
$condition | string|array |
public function createConditionFromArray($condition)
{
if (isset($condition[0])) { // operator format: operator, operand 1, operand 2, ...
$operator = strtoupper(array_shift($condition));
if (isset($this->conditionClasses[$operator])) {
$className = $this->conditionClasses[$operator];
} else {
$className = 'yii\db\conditions\SimpleCondition';
}
/** @var ConditionInterface $className */
return $className::fromArrayDefinition($operator, $condition);
}
// hash format: 'column1' => 'value1', 'column2' => 'value2', ...
return new HashCondition($condition);
}
定义于: yii\db\QueryBuilder::createIndex()
构建一个 SQL 语句,用于创建新的索引。
public string createIndex ( $name, $table, $columns, $unique = false ) | ||
$name | 字符串 |
索引的名称。该名称将由该方法正确地引用。 |
$table | 字符串 |
将创建新索引的目标表。表名将由该方法正确地引用。 |
$columns | string|array |
应包含在索引中的列。如果有多列,请用逗号分隔或使用数组表示它们。每个列名将由该方法正确地引用,除非在名称中找到括号。 |
$unique | boolean |
是否在创建的索引上添加 UNIQUE 约束。 |
返回值 | 字符串 |
创建新索引的 SQL 语句。 |
---|
public function createIndex($name, $table, $columns, $unique = false)
{
return ($unique ? 'CREATE UNIQUE INDEX ' : 'CREATE INDEX ')
. $this->db->quoteTableName($name) . ' ON '
. $this->db->quoteTableName($table)
. ' (' . $this->buildColumns($columns) . ')';
}
定义于: yii\db\QueryBuilder::createTable()
构建一个 SQL 语句,用于创建新的数据库表。
新表中的列应指定为名称-定义对(例如,'name' => 'string'),其中名称代表列名,该名称将由该方法正确地引用,定义代表列类型,该类型必须包含抽象 DB 类型。将调用 getColumnType() 方法将任何抽象类型转换为物理类型。
如果只指定列的定义(例如,'PRIMARY KEY (name, type)'),则它将直接插入到生成的 SQL 中。
例如,
$sql = $queryBuilder->createTable('user', [
'id' => 'pk',
'name' => 'string',
'age' => 'integer',
'column_name double precision null default null', # definition only example
]);
public string createTable ( $table, $columns, $options = null ) | ||
$table | 字符串 |
要创建的表的名称。该名称将由该方法正确地引用。 |
$columns | 数组 |
新表中的列(名称 => 定义)。 |
$options | string|null |
将附加到生成的 SQL 的其他 SQL 片段。 |
返回值 | 字符串 |
创建新 DB 表的 SQL 语句。 |
---|
public function createTable($table, $columns, $options = null)
{
$cols = [];
foreach ($columns as $name => $type) {
if (is_string($name)) {
$cols[] = "\t" . $this->db->quoteColumnName($name) . ' ' . $this->getColumnType($type);
} else {
$cols[] = "\t" . $type;
}
}
$sql = 'CREATE TABLE ' . $this->db->quoteTableName($table) . " (\n" . implode(",\n", $cols) . "\n)";
return $options === null ? $sql : $sql . ' ' . $options;
}
定义于: yii\db\QueryBuilder::createView()
创建 SQL 视图。
public string createView ( $viewName, $subQuery ) | ||
$viewName | 字符串 |
要创建的视图的名称。 |
$subQuery | string|yii\db\Query |
定义视图的选择语句。这可以是字符串或 yii\db\Query 对象。 |
返回值 | 字符串 |
|
---|
public function createView($viewName, $subQuery)
{
if ($subQuery instanceof Query) {
list($rawQuery, $params) = $this->build($subQuery);
array_walk(
$params,
function (&$param) {
$param = $this->db->quoteValue($param);
}
);
$subQuery = strtr($rawQuery, $params);
}
return 'CREATE VIEW ' . $this->db->quoteTableName($viewName) . ' AS ' . $subQuery;
}
定义于: yii\db\QueryBuilder::defaultConditionClasses()
包含默认条件类的数组。如果要更改查询构建器的默认条件类,请扩展此方法。有关详细信息,请参阅 $conditionClasses 文档。
另请参见 $conditionClasses.
protected array defaultConditionClasses ( ) |
protected function defaultConditionClasses()
{
return [
'NOT' => 'yii\db\conditions\NotCondition',
'AND' => 'yii\db\conditions\AndCondition',
'OR' => 'yii\db\conditions\OrCondition',
'BETWEEN' => 'yii\db\conditions\BetweenCondition',
'NOT BETWEEN' => 'yii\db\conditions\BetweenCondition',
'IN' => 'yii\db\conditions\InCondition',
'NOT IN' => 'yii\db\conditions\InCondition',
'LIKE' => 'yii\db\conditions\LikeCondition',
'NOT LIKE' => 'yii\db\conditions\LikeCondition',
'OR LIKE' => 'yii\db\conditions\LikeCondition',
'OR NOT LIKE' => 'yii\db\conditions\LikeCondition',
'EXISTS' => 'yii\db\conditions\ExistsCondition',
'NOT EXISTS' => 'yii\db\conditions\ExistsCondition',
];
}
包含默认表达式构建器的数组。如果要更改此查询构建器的默认表达式构建器,请扩展此方法并覆盖它。有关详细信息,请参阅 $expressionBuilders 文档。
protected array defaultExpressionBuilders ( ) |
protected function defaultExpressionBuilders()
{
return array_merge(parent::defaultExpressionBuilders(), [
'yii\db\conditions\InCondition' => 'yii\db\oci\conditions\InConditionBuilder',
'yii\db\conditions\LikeCondition' => 'yii\db\oci\conditions\LikeConditionBuilder',
]);
}
定义于: yii\db\QueryBuilder::delete()
创建一个 DELETE SQL 语句。
例如,
$sql = $queryBuilder->delete('user', 'status = 0');
该方法将正确地转义表名和列名。
public string delete ( $table, $condition, &$params ) | ||
$table | 字符串 |
将从中删除数据的表。 |
$condition | array|string |
将放在 WHERE 部分的条件。请参考 yii\db\Query::where() 了解如何指定条件。 |
$params | 数组 |
将由该方法修改的绑定参数,以便稍后可以将它们绑定到 DB 命令。 |
返回值 | 字符串 |
DELETE SQL |
---|
public function delete($table, $condition, &$params)
{
$sql = 'DELETE FROM ' . $this->db->quoteTableName($table);
$where = $this->buildWhere($condition, $params);
return $where === '' ? $sql : $sql . ' ' . $where;
}
定义于: yii\db\QueryBuilder::dropCheck()
创建一个 SQL 命令,用于删除检查约束。
public string dropCheck ( $name, $table ) | ||
$name | 字符串 |
要删除的检查约束的名称。该名称将由该方法正确地引用。 |
$table | 字符串 |
将删除其检查约束的表。该名称将由该方法正确地引用。 |
返回值 | 字符串 |
删除检查约束的 SQL 语句。 |
---|
public function dropCheck($name, $table)
{
return 'ALTER TABLE ' . $this->db->quoteTableName($table)
. ' DROP CONSTRAINT ' . $this->db->quoteColumnName($name);
}
定义于: yii\db\QueryBuilder::dropColumn()
构建一个 SQL 语句,用于删除数据库列。
public string dropColumn ( $table, $column ) | ||
$table | 字符串 |
要删除列的表。名称将由方法正确引用。 |
$column | 字符串 |
要删除的列的名称。名称将由方法正确引用。 |
返回值 | 字符串 |
删除 DB 列的 SQL 语句。 |
---|
public function dropColumn($table, $column)
{
return 'ALTER TABLE ' . $this->db->quoteTableName($table)
. ' DROP COLUMN ' . $this->db->quoteColumnName($column);
}
构建一个 SQL 命令,用于向列添加注释。
public string dropCommentFromColumn ( $table, $column ) | ||
$table | 字符串 |
要对其列进行注释的表。表名将由方法正确引用。 |
$column | 字符串 |
要进行注释的列的名称。列名将由方法正确引用。 |
返回值 | 字符串 |
在列上添加注释的 SQL 语句 |
---|
public function dropCommentFromColumn($table, $column)
{
return 'COMMENT ON COLUMN ' . $this->db->quoteTableName($table) . '.' . $this->db->quoteColumnName($column) . " IS ''";
}
构建一个 SQL 命令,用于向表添加注释。
public string dropCommentFromTable ( $table ) | ||
$table | 字符串 |
要对其列进行注释的表。表名将由方法正确引用。 |
返回值 | 字符串 |
在列上添加注释的 SQL 语句 |
---|
public function dropCommentFromTable($table)
{
return 'COMMENT ON TABLE ' . $this->db->quoteTableName($table) . " IS ''";
}
定义于: yii\db\QueryBuilder::dropDefaultValue()
创建一个 SQL 命令,用于删除默认值约束。
public string dropDefaultValue ( $name, $table ) | ||
$name | 字符串 |
要删除的默认值约束的名称。名称将由方法正确引用。 |
$table | 字符串 |
要删除默认值约束的表。名称将由方法正确引用。 |
返回值 | 字符串 |
删除默认值约束的 SQL 语句。 |
---|---|---|
抛出 | yii\base\NotSupportedException |
如果底层 DBMS 不支持此功能。 |
public function dropDefaultValue($name, $table)
{
throw new NotSupportedException($this->db->getDriverName() . ' does not support dropping default value constraints.');
}
定义于: yii\db\QueryBuilder::dropForeignKey()
构建一个 SQL 语句,用于删除外键约束。
public string dropForeignKey ( $name, $table ) | ||
$name | 字符串 |
要删除的外键约束的名称。名称将由方法正确引用。 |
$table | 字符串 |
要删除外键的表。名称将由方法正确引用。 |
返回值 | 字符串 |
删除外键约束的 SQL 语句。 |
---|
public function dropForeignKey($name, $table)
{
return 'ALTER TABLE ' . $this->db->quoteTableName($table)
. ' DROP CONSTRAINT ' . $this->db->quoteColumnName($name);
}
构建一个 SQL 语句,用于删除索引。
public string dropIndex ( $name, $table ) | ||
$name | 字符串 |
要删除的索引的名称。名称将由方法正确引用。 |
$table | 字符串 |
要删除索引的表。名称将由方法正确引用。 |
返回值 | 字符串 |
删除索引的 SQL 语句。 |
---|
public function dropIndex($name, $table)
{
return 'DROP INDEX ' . $this->db->quoteTableName($name);
}
定义于: yii\db\QueryBuilder::dropPrimaryKey()
构建一个 SQL 语句,用于从现有表中删除主键约束。
public string dropPrimaryKey ( $name, $table ) | ||
$name | 字符串 |
要删除的主键约束的名称。 |
$table | 字符串 |
将从中删除主键约束的表。 |
返回值 | 字符串 |
从现有表中删除主键约束的 SQL 语句。 |
---|
public function dropPrimaryKey($name, $table)
{
return 'ALTER TABLE ' . $this->db->quoteTableName($table)
. ' DROP CONSTRAINT ' . $this->db->quoteColumnName($name);
}
定义于: yii\db\QueryBuilder::dropTable()
构建一个 SQL 语句,用于删除数据库表。
public string dropTable ( $table ) | ||
$table | 字符串 |
要删除的表。名称将由方法正确引用。 |
返回值 | 字符串 |
删除 DB 表的 SQL 语句。 |
---|
public function dropTable($table)
{
return 'DROP TABLE ' . $this->db->quoteTableName($table);
}
定义于: yii\db\QueryBuilder::dropUnique()
创建一个 SQL 命令,用于删除唯一约束。
public string dropUnique ( $name, $table ) | ||
$name | 字符串 |
要删除的唯一约束的名称。名称将由方法正确引用。 |
$table | 字符串 |
要删除唯一约束的表。名称将由方法正确引用。 |
返回值 | 字符串 |
删除唯一约束的 SQL 语句。 |
---|
public function dropUnique($name, $table)
{
return 'ALTER TABLE ' . $this->db->quoteTableName($table)
. ' DROP CONSTRAINT ' . $this->db->quoteColumnName($name);
}
定义于: yii\db\QueryBuilder::dropView()
删除 SQL 视图。
public string dropView ( $viewName ) | ||
$viewName | 字符串 |
要删除的视图的名称。 |
返回值 | 字符串 |
|
---|
public function dropView($viewName)
{
return 'DROP VIEW ' . $this->db->quoteTableName($viewName);
}
执行一个 SQL 语句,用于重置表主键的序列值。
执行的原因是某些数据库(Oracle)需要多个查询才能做到这一点。序列被重置,以便插入的下一行新行的主键将具有指定的值或最大现有值+1。
public void executeResetSequence ( $table, $value = null ) | ||
$table | 字符串 |
主键序列被重置的表的名称 |
$value | array|string|null |
插入的下一行新行的主键的值。如果未设置此值,则下一行新行的主键将具有最大现有值+1。 |
抛出 | yii\base\NotSupportedException |
如果底层 DBMS 不支持此功能 |
---|
public function executeResetSequence($table, $value = null)
{
$tableSchema = $this->db->getTableSchema($table);
if ($tableSchema === null) {
throw new InvalidArgumentException("Unknown table: $table");
}
if ($tableSchema->sequenceName === null) {
throw new InvalidArgumentException("There is no sequence associated with table: $table");
}
if ($value !== null) {
$value = (int) $value;
} else {
if (count($tableSchema->primaryKey) > 1) {
throw new InvalidArgumentException("Can't reset sequence for composite primary key in table: $table");
}
// use master connection to get the biggest PK value
$value = $this->db->useMaster(function (Connection $db) use ($tableSchema) {
return $db->createCommand(
'SELECT MAX("' . $tableSchema->primaryKey[0] . '") FROM "' . $tableSchema->name . '"'
)->queryScalar();
}) + 1;
}
//Oracle needs at least two queries to reset sequence (see adding transactions and/or use alter method to avoid grants' issue?)
$this->db->createCommand('DROP SEQUENCE "' . $tableSchema->sequenceName . '"')->execute();
$this->db->createCommand('CREATE SEQUENCE "' . $tableSchema->sequenceName . '" START WITH ' . $value
. ' INCREMENT BY 1 NOMAXVALUE NOCACHE')->execute();
}
定义于: yii\db\QueryBuilder::extractAlias()
如果存在,则提取表别名,否则返回 false
protected boolean|array extractAlias ( $table ) | ||
$table |
protected function extractAlias($table)
{
if (preg_match('/^(.*?)(?i:\s+as|)\s+([^ ]+)$/', $table, $matches)) {
return $matches;
}
return false;
}
定义于: yii\db\QueryBuilder::getColumnType()
将抽象列类型转换为物理列类型。
转换使用 $typeMap 中指定的类型映射表进行。支持以下抽象列类型(以 MySQL 为例解释对应的物理类型)
pk
:自增主键类型,将转换为 "int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY"bigpk
:自增主键类型,将转换为 "bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY"upk
:无符号自增主键类型,将转换为 "int(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY"char
:字符类型,将转换为 "char(1)"string
:字符串类型,将转换为 "varchar(255)"text
:长字符串类型,将转换为 "text"smallint
:小整数类型,将转换为 "smallint(6)"integer
:整数类型,将转换为 "int(11)"bigint
:大整数类型,将转换为 "bigint(20)"boolean
:布尔类型,将转换为 "tinyint(1)"float
`: 浮点数类型,将转换为 "float"decimal
:十进制数类型,将转换为 "decimal"datetime
:日期时间类型,将转换为 "datetime"timestamp
:时间戳类型,将转换为 "timestamp"time
:时间类型,将转换为 "time"date
:日期类型,将转换为 "date"money
:货币类型,将转换为 "decimal(19,4)"binary
:二进制数据类型,将转换为 "blob"
如果抽象类型包含两个或多个由空格分隔的部分(例如 "string NOT NULL"),则只会转换第一部分,其余部分将追加到转换后的结果。例如,'string NOT NULL' 将转换为 'varchar(255) NOT NULL'。
对于一些抽象类型,您也可以通过在类型后直接添加圆括号中的长度或精度约束来指定。例如,string(32)
在 MySQL 数据库中将转换为 "varchar(32)"。如果底层 DBMS 不支持此类类型的约束,则会忽略它们。
如果 $typeMap 中找不到类型,则会返回该类型,不做任何更改。
public string getColumnType ( $type ) | ||
$type | string|yii\db\ColumnSchemaBuilder |
抽象列类型 |
返回值 | 字符串 |
物理列类型。 |
---|
public function getColumnType($type)
{
if ($type instanceof ColumnSchemaBuilder) {
$type = $type->__toString();
}
if (isset($this->typeMap[$type])) {
return $this->typeMap[$type];
} elseif (preg_match('/^(\w+)\((.+?)\)(.*)$/', $type, $matches)) {
if (isset($this->typeMap[$matches[1]])) {
return preg_replace('/\(.+\)/', '(' . $matches[2] . ')', $this->typeMap[$matches[1]]) . $matches[3];
}
} elseif (preg_match('/^(\w+)\s+/', $type, $matches)) {
if (isset($this->typeMap[$matches[1]])) {
return preg_replace('/^\w+/', $this->typeMap[$matches[1]], $type);
}
}
return $type;
}
定义于: yii\db\QueryBuilder::getExpressionBuilder()
获取适合 $expression 的 yii\db\ExpressionBuilderInterface 对象。
使用 $expressionBuilders 数组查找合适的构建器类。
public yii\db\ExpressionBuilderInterface getExpressionBuilder ( yii\db\ExpressionInterface $expression ) | ||
$expression | yii\db\ExpressionInterface | |
抛出 | yii\base\InvalidArgumentException |
当此 QueryBuilder 不支持 $expression 构建时。 |
---|
public function getExpressionBuilder(ExpressionInterface $expression)
{
$className = get_class($expression);
if (!isset($this->expressionBuilders[$className])) {
foreach (array_reverse($this->expressionBuilders) as $expressionClass => $builderClass) {
if (is_subclass_of($expression, $expressionClass)) {
$this->expressionBuilders[$className] = $builderClass;
break;
}
}
if (!isset($this->expressionBuilders[$className])) {
throw new InvalidArgumentException('Expression of class ' . $className . ' can not be built in ' . get_class($this));
}
}
if ($this->expressionBuilders[$className] === __CLASS__) {
return $this;
}
if (!is_object($this->expressionBuilders[$className])) {
$this->expressionBuilders[$className] = new $this->expressionBuilders[$className]($this);
}
return $this->expressionBuilders[$className];
}
定义于: yii\db\QueryBuilder::hasLimit()
检查给定的限制是否有效。
protected boolean hasLimit ( $limit ) | ||
$limit | mixed |
给定的限制 |
返回值 | boolean |
限制是否有效 |
---|
protected function hasLimit($limit)
{
return ($limit instanceof ExpressionInterface) || ctype_digit((string)$limit);
}
定义于: yii\base\BaseObject::hasMethod()
返回一个值,指示是否定义了方法。
默认实现是调用 php 函数 method_exists()
。当您实现 php 魔术方法 __call()
时,您可以覆盖此方法。
public boolean hasMethod ( $name ) | ||
$name | 字符串 |
方法名称 |
返回值 | boolean |
方法是否已定义 |
---|
public function hasMethod($name)
{
return method_exists($this, $name);
}
定义于: yii\db\QueryBuilder::hasOffset()
检查给定的偏移量是否有效。
protected boolean hasOffset ( $offset ) | ||
$offset | mixed |
给定的偏移量 |
返回值 | boolean |
偏移量是否有效 |
---|
protected function hasOffset($offset)
{
return ($offset instanceof ExpressionInterface) || ctype_digit((string)$offset) && (string)$offset !== '0';
}
定义于: yii\base\BaseObject::hasProperty()
返回一个值,指示是否定义了属性。
属性的定义条件为
- 类具有与指定名称关联的 getter 或 setter 方法(在这种情况下,属性名称不区分大小写);
- 该类具有与指定名称匹配的成员变量(当
$checkVars
为真时);
参见
public boolean hasProperty ( $name, $checkVars = true ) | ||
$name | 字符串 |
属性名称 |
$checkVars | boolean |
是否将成员变量视为属性 |
返回值 | boolean |
属性是否已定义 |
---|
public function hasProperty($name, $checkVars = true)
{
return $this->canGetProperty($name, $checkVars) || $this->canSetProperty($name, false);
}
public void init ( ) |
public function init()
{
parent::init();
$this->expressionBuilders = array_merge($this->defaultExpressionBuilders(), $this->expressionBuilders);
$this->conditionClasses = array_merge($this->defaultConditionClasses(), $this->conditionClasses);
}
定义于: yii\db\QueryBuilder::insert()
创建一个 INSERT SQL 语句。
例如,`
php $sql = $queryBuilder->insert('user', [
'name' => 'Sam',
'age' => 30,
], $params); `
该方法将正确地转义表名和列名。
public string insert ( $table, $columns, &$params ) | ||
$table | 字符串 |
将插入新行的表。 |
$columns | array|yii\db\Query |
要插入到表中的列数据(名称 => 值)或 Query 的实例以执行 INSERT INTO ... SELECT SQL 语句。从版本 2.0.11 开始,支持传递 Query 对象。 |
$params | 数组 |
此方法将生成的绑定参数。它们应稍后绑定到 DB 命令。 |
返回值 | 字符串 |
INSERT SQL |
---|
public function insert($table, $columns, &$params)
{
list($names, $placeholders, $values, $params) = $this->prepareInsertValues($table, $columns, $params);
return 'INSERT INTO ' . $this->db->quoteTableName($table)
. (!empty($names) ? ' (' . implode(', ', $names) . ')' : '')
. (!empty($placeholders) ? ' VALUES (' . implode(', ', $placeholders) . ')' : $values);
}
定义于: yii\db\QueryBuilder::prepareInsertSelectSubQuery()
为 INSERT INTO ... SELECT SQL 语句准备 select-subquery 和字段名称。
protected array prepareInsertSelectSubQuery ( $columns, $schema, $params = [] ) | ||
$columns | yii\db\Query |
表示 select 查询的对象。 |
$schema | yii\db\Schema |
用于引用列名的 Schema 对象。 |
$params | 数组 |
要绑定到生成的 SQL 语句的参数。 这些参数将与在查询构建过程中生成的额外参数一起包含在结果中。 |
返回值 | 数组 |
列名、值和参数的数组。 |
---|---|---|
抛出 | yii\base\InvalidArgumentException |
如果查询的 select 不包含仅命名参数。 |
protected function prepareInsertSelectSubQuery($columns, $schema, $params = [])
{
if (!is_array($columns->select) || empty($columns->select) || in_array('*', $columns->select)) {
throw new InvalidArgumentException('Expected select query object with enumerated (named) parameters');
}
list($values, $params) = $this->build($columns, $params);
$names = [];
$values = ' ' . $values;
foreach ($columns->select as $title => $field) {
if (is_string($title)) {
$names[] = $schema->quoteColumnName($title);
} elseif (preg_match('/^(.*?)(?i:\s+as\s+|\s+)([\w\-_\.]+)$/', $field, $matches)) {
$names[] = $schema->quoteColumnName($matches[2]);
} else {
$names[] = $schema->quoteColumnName($field);
}
}
return [$names, $values, $params];
}
为 INSERT SQL 语句准备 VALUES 部分。
protected array prepareInsertValues ( $table, $columns, $params = [] ) | ||
$table | 字符串 |
将插入新行的表。 |
$columns | array|yii\db\Query |
要插入表的列数据(名称 => 值)或 Query 的实例,以执行 INSERT INTO ... SELECT SQL 语句。 |
$params | 数组 |
此方法将生成的绑定参数。它们应稍后绑定到 DB 命令。 |
返回值 | 数组 |
列名称、占位符、值和参数的数组。 |
---|
protected function prepareInsertValues($table, $columns, $params = [])
{
list($names, $placeholders, $values, $params) = parent::prepareInsertValues($table, $columns, $params);
if (!$columns instanceof Query && empty($names)) {
$tableSchema = $this->db->getSchema()->getTableSchema($table);
if ($tableSchema !== null) {
$columns = !empty($tableSchema->primaryKey) ? $tableSchema->primaryKey : [reset($tableSchema->columns)->name];
foreach ($columns as $name) {
$names[] = $this->db->quoteColumnName($name);
$placeholders[] = 'DEFAULT';
}
}
}
return [$names, $placeholders, $values, $params];
}
定义于: yii\db\QueryBuilder::prepareUpdateSets()
为 UPDATE SQL 语句准备 SET 部分。
protected array prepareUpdateSets ( $table, $columns, $params = [] ) | ||
$table | 字符串 |
要更新的表。 |
$columns | 数组 |
要更新的列数据(名称 => 值)。 |
$params | 数组 |
将由该方法修改的绑定参数,以便稍后可以将它们绑定到 DB 命令。 |
返回值 | 数组 |
用于 |
---|
protected function prepareUpdateSets($table, $columns, $params = [])
{
$tableSchema = $this->db->getTableSchema($table);
$columnSchemas = $tableSchema !== null ? $tableSchema->columns : [];
$sets = [];
foreach ($columns as $name => $value) {
$value = isset($columnSchemas[$name]) ? $columnSchemas[$name]->dbTypecast($value) : $value;
if ($value instanceof ExpressionInterface) {
$placeholder = $this->buildExpression($value, $params);
} else {
$placeholder = $this->bindParam($value, $params);
}
$sets[] = $this->db->quoteColumnName($name) . '=' . $placeholder;
}
return [$sets, $params];
}
protected array prepareUpsertColumns ( $table, $insertColumns, $updateColumns, &$constraints = [] ) | ||
$table | 字符串 | |
$insertColumns | array|yii\db\Query | |
$updateColumns | array|boolean | |
$constraints | yii\db\Constraint[] |
此参数接收匹配的约束列表。约束将根据其列名称进行唯一标识。 |
protected function prepareUpsertColumns($table, $insertColumns, $updateColumns, &$constraints = [])
{
if ($insertColumns instanceof Query) {
list($insertNames) = $this->prepareInsertSelectSubQuery($insertColumns, $this->db->getSchema());
} else {
$insertNames = array_map([$this->db, 'quoteColumnName'], array_keys($insertColumns));
}
$uniqueNames = $this->getTableUniqueColumnNames($table, $insertNames, $constraints);
$uniqueNames = array_map([$this->db, 'quoteColumnName'], $uniqueNames);
if ($updateColumns !== true) {
return [$uniqueNames, $insertNames, null];
}
return [$uniqueNames, $insertNames, array_diff($insertNames, $uniqueNames)];
}
定义于: yii\db\QueryBuilder::renameColumn()
构建一个 SQL 语句,用于重命名列。
public string renameColumn ( $table, $oldName, $newName ) | ||
$table | 字符串 |
要重命名其列的表。该名称将由该方法正确引用。 |
$oldName | 字符串 |
列的旧名称。该名称将由该方法正确引用。 |
$newName | 字符串 |
列的新名称。该名称将由该方法正确引用。 |
返回值 | 字符串 |
重命名 DB 列的 SQL 语句。 |
---|
public function renameColumn($table, $oldName, $newName)
{
return 'ALTER TABLE ' . $this->db->quoteTableName($table)
. ' RENAME COLUMN ' . $this->db->quoteColumnName($oldName)
. ' TO ' . $this->db->quoteColumnName($newName);
}
构建一个 SQL 语句,用于重命名数据库表。
public string renameTable ( $table, $newName ) | ||
$table | 字符串 |
要重命名的表。该名称将由该方法正确引用。 |
$newName | 字符串 |
新的表名称。该名称将由该方法正确引用。 |
返回值 | 字符串 |
重命名 DB 表的 SQL 语句。 |
---|
public function renameTable($table, $newName)
{
return 'ALTER TABLE ' . $this->db->quoteTableName($table) . ' RENAME TO ' . $this->db->quoteTableName($newName);
}
定义于: yii\db\QueryBuilder::resetSequence()
创建一个 SQL 语句,用于重置表主键的序列值。
序列将被重置,以便插入的下一行新行的主键具有指定的值或最大现有值 +1。
public string resetSequence ( $table, $value = null ) | ||
$table | 字符串 |
要重置其主键序列的表的名称 |
$value | array|string|null |
插入的下一行新行的主键的值。如果未设置此值,则下一行新行的主键将具有最大现有值+1。 |
返回值 | 字符串 |
重置序列的 SQL 语句 |
---|---|---|
抛出 | yii\base\NotSupportedException |
如果底层 DBMS 不支持此功能 |
public function resetSequence($table, $value = null)
{
throw new NotSupportedException($this->db->getDriverName() . ' does not support resetting sequence.');
}
创建一个 SELECT EXISTS() SQL 语句。
public string selectExists ( $rawSql ) | ||
$rawSql | 字符串 |
要从中选择的子查询的原始形式。 |
返回值 | 字符串 |
SELECT EXISTS() SQL 语句。 |
---|
public function selectExists($rawSql)
{
return 'SELECT CASE WHEN EXISTS(' . $rawSql . ') THEN 1 ELSE 0 END FROM DUAL';
}
public void setConditionClasses ( $classes ) | ||
$classes | 字符串[] |
条件别名到条件类的映射。例如
|
public function setConditionClasses($classes)
{
$this->conditionClasses = array_merge($this->conditionClasses, $classes);
}
public void setExpressionBuilders ( $builders ) | ||
$builders | 字符串[] |
应该与 $expressionBuilders 属性中预定义的构建器合并的构建器数组。 |
public function setExpressionBuilders($builders)
{
$this->expressionBuilders = array_merge($this->expressionBuilders, $builders);
}
定义于: yii\db\QueryBuilder::truncateTable()
构建一个 SQL 语句,用于截断数据库表。
public string truncateTable ( $table ) | ||
$table | 字符串 |
要截断的表。该名称将由该方法正确引用。 |
返回值 | 字符串 |
截断 DB 表的 SQL 语句。 |
---|
public function truncateTable($table)
{
return 'TRUNCATE TABLE ' . $this->db->quoteTableName($table);
}
定义于: yii\db\QueryBuilder::update()
创建一个 UPDATE SQL 语句。
例如,
$params = [];
$sql = $queryBuilder->update('user', ['status' => 1], 'age > 30', $params);
该方法将正确地转义表名和列名。
public string update ( $table, $columns, $condition, &$params ) | ||
$table | 字符串 |
要更新的表。 |
$columns | 数组 |
要更新的列数据(名称 => 值)。 |
$condition | array|string |
将放在 WHERE 部分的条件。请参考 yii\db\Query::where() 了解如何指定条件。 |
$params | 数组 |
将由该方法修改的绑定参数,以便稍后可以将它们绑定到 DB 命令。 |
返回值 | 字符串 |
UPDATE SQL |
---|
public function update($table, $columns, $condition, &$params)
{
list($lines, $params) = $this->prepareUpdateSets($table, $columns, $params);
$sql = 'UPDATE ' . $this->db->quoteTableName($table) . ' SET ' . implode(', ', $lines);
$where = $this->buildWhere($condition, $params);
return $where === '' ? $sql : $sql . ' ' . $where;
}
创建一个 SQL 语句,用于将行插入数据库表(如果它们不存在,则匹配唯一约束),或更新它们(如果它们存在)。
例如,
$sql = $queryBuilder->upsert('pages', [
'name' => 'Front page',
'url' => 'https://example.com/', // url is unique
'visits' => 0,
], [
'visits' => new \yii\db\Expression('visits + 1'),
], $params);
该方法将正确地转义表名和列名。
另请参见 https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htm#SQLRF01606。
public string upsert ( $table, $insertColumns, $updateColumns, &$params ) | ||
$table | 字符串 |
将要插入/更新新行的表。 |
$insertColumns | array|yii\db\Query |
要插入到表中的列数据(名称 => 值)或 yii\db\Query 的实例,用于执行 |
$updateColumns | array|boolean |
如果列数据已存在,则要更新的列数据(名称 => 值)。如果传递 |
$params | 数组 |
此方法将生成的绑定参数。它们应稍后绑定到 DB 命令。 |
返回值 | 字符串 |
生成的 SQL。 |
---|---|---|
抛出 | yii\base\NotSupportedException |
如果底层 DBMS 不支持此功能。 |
public function upsert($table, $insertColumns, $updateColumns, &$params)
{
/** @var Constraint[] $constraints */
list($uniqueNames, $insertNames, $updateNames) = $this->prepareUpsertColumns($table, $insertColumns, $updateColumns, $constraints);
if (empty($uniqueNames)) {
return $this->insert($table, $insertColumns, $params);
}
if ($updateNames === []) {
// there are no columns to update
$updateColumns = false;
}
$onCondition = ['or'];
$quotedTableName = $this->db->quoteTableName($table);
foreach ($constraints as $constraint) {
$constraintCondition = ['and'];
foreach ($constraint->columnNames as $name) {
$quotedName = $this->db->quoteColumnName($name);
$constraintCondition[] = "$quotedTableName.$quotedName=\"EXCLUDED\".$quotedName";
}
$onCondition[] = $constraintCondition;
}
$on = $this->buildCondition($onCondition, $params);
list(, $placeholders, $values, $params) = $this->prepareInsertValues($table, $insertColumns, $params);
if (!empty($placeholders)) {
$usingSelectValues = [];
foreach ($insertNames as $index => $name) {
$usingSelectValues[$name] = new Expression($placeholders[$index]);
}
$usingSubQuery = (new Query())
->select($usingSelectValues)
->from('DUAL');
list($usingValues, $params) = $this->build($usingSubQuery, $params);
}
$mergeSql = 'MERGE INTO ' . $this->db->quoteTableName($table) . ' '
. 'USING (' . (isset($usingValues) ? $usingValues : ltrim($values, ' ')) . ') "EXCLUDED" '
. "ON ($on)";
$insertValues = [];
foreach ($insertNames as $name) {
$quotedName = $this->db->quoteColumnName($name);
if (strrpos($quotedName, '.') === false) {
$quotedName = '"EXCLUDED".' . $quotedName;
}
$insertValues[] = $quotedName;
}
$insertSql = 'INSERT (' . implode(', ', $insertNames) . ')'
. ' VALUES (' . implode(', ', $insertValues) . ')';
if ($updateColumns === false) {
return "$mergeSql WHEN NOT MATCHED THEN $insertSql";
}
if ($updateColumns === true) {
$updateColumns = [];
foreach ($updateNames as $name) {
$quotedName = $this->db->quoteColumnName($name);
if (strrpos($quotedName, '.') === false) {
$quotedName = '"EXCLUDED".' . $quotedName;
}
$updateColumns[$name] = new Expression($quotedName);
}
}
list($updates, $params) = $this->prepareUpdateSets($table, $updateColumns, $params);
$updateSql = 'UPDATE SET ' . implode(', ', $updates);
return "$mergeSql WHEN MATCHED THEN $updateSql WHEN NOT MATCHED THEN $insertSql";
}
请 注册 或 登录 以发表评论。