0 追蹤者

類別 yii\db\mssql\QueryBuilder

繼承關係yii\db\mssql\QueryBuilder » yii\db\QueryBuilder » yii\base\BaseObject
實作介面yii\base\Configurable
自版本起可用2.0
原始碼 https://github.com/yiisoft/yii2/blob/master/framework/db/mssql/QueryBuilder.php

QueryBuilder 是用於 MS SQL Server 資料庫(2008 及以上版本)的查詢建構器。

公共屬性

隱藏繼承的屬性

屬性 類型 描述 定義於
$conditionBuilders 陣列 查詢條件到建構器方法的映射。 yii\db\QueryBuilder
$conditionClasses 陣列 條件別名到條件類別的映射。 yii\db\QueryBuilder
$db yii\db\Connection 資料庫連線。 yii\db\QueryBuilder
$expressionBuilders string[]|yii\db\ExpressionBuilderInterface[] 將表達式類別映射到表達式建構器類別。 yii\db\QueryBuilder
$separator 字串 SQL 語句不同片段之間的分隔符。 yii\db\QueryBuilder
$typeMap 陣列 從抽象欄位類型(鍵)到物理欄位類型(值)的映射。 yii\db\mssql\QueryBuilder

受保護的屬性

隱藏繼承的屬性

屬性 類型 描述 定義於

公共方法

隱藏繼承的方法

方法 描述 定義於
__call() 調用指定的非類別方法。 yii\base\BaseObject
__construct() 建構子。 yii\db\QueryBuilder
__get() 返回物件屬性的值。 yii\base\BaseObject
__isset() 檢查屬性是否已設定,即已定義且非 null。 yii\base\BaseObject
__set() 設定物件屬性的值。 yii\base\BaseObject
__unset() 將物件屬性設定為 null。 yii\base\BaseObject
addCheck() 建立用於將檢查約束新增到現有表格的 SQL 命令。 yii\db\QueryBuilder
addColumn() 建構用於新增新的資料庫欄位的 SQL 語句。 yii\db\QueryBuilder
addCommentOnColumn() 建構用於新增欄位註解的 SQL 命令。 yii\db\mssql\QueryBuilder
addCommentOnTable() 建構用於新增表格註解的 SQL 命令。 yii\db\mssql\QueryBuilder
addDefaultValue() 建立用於將預設值約束新增到現有表格的 SQL 命令。 yii\db\mssql\QueryBuilder
addForeignKey() 建構用於將外鍵約束新增到現有表格的 SQL 語句。 yii\db\QueryBuilder
addPrimaryKey() 建構用於將主鍵約束新增到現有表格的 SQL 語句。 yii\db\QueryBuilder
addUnique() 建立用於將唯一約束新增到現有表格的 SQL 命令。 yii\db\QueryBuilder
alterColumn() 建構用於更改欄位定義的 SQL 語句。 yii\db\mssql\QueryBuilder
batchInsert() 產生批次 INSERT SQL 語句。 yii\db\QueryBuilder
bindParam() 輔助方法,使用 PARAM_PREFIX 將 $value 新增到 $params 陣列。 yii\db\QueryBuilder
build() yii\db\Query 物件產生 SELECT SQL 陳述式。 yii\db\QueryBuilder
buildAndCondition() 使用 ANDOR 運算子連接兩個或多個 SQL 表達式。 yii\db\QueryBuilder
buildBetweenCondition() 建立使用 BETWEEN 運算子的 SQL 表達式。 yii\db\QueryBuilder
buildColumns() 處理欄位,並在必要時正確地加上引號。 yii\db\QueryBuilder
buildCondition() 解析條件規格並產生對應的 SQL 表達式。 yii\db\QueryBuilder
buildExistsCondition() 建立使用 EXISTS 運算子的 SQL 表達式。 yii\db\QueryBuilder
buildExpression() 建立給定的 $expression yii\db\QueryBuilder
buildFrom() yii\db\QueryBuilder
buildGroupBy() yii\db\QueryBuilder
buildHashCondition() 根據欄位-值配對建立條件。 yii\db\QueryBuilder
buildHaving() yii\db\QueryBuilder
buildInCondition() 建立使用 IN 運算子的 SQL 表達式。 yii\db\QueryBuilder
buildJoin() yii\db\QueryBuilder
buildLikeCondition() 建立使用 LIKE 運算子的 SQL 表達式。 yii\db\QueryBuilder
buildLimit() yii\db\QueryBuilder
buildNotCondition() 使用 NOT 運算子反轉 SQL 表達式。 yii\db\QueryBuilder
buildOrderBy() yii\db\QueryBuilder
buildOrderByAndLimit() 建立 ORDER BY 和 LIMIT/OFFSET 子句,並將它們附加到給定的 SQL。 yii\db\mssql\QueryBuilder
buildSelect() yii\db\QueryBuilder
buildSimpleCondition() 建立類似 "column" operator value 的 SQL 表達式。 yii\db\QueryBuilder
buildUnion() yii\db\QueryBuilder
buildWhere() yii\db\QueryBuilder
buildWithQueries() yii\db\QueryBuilder
canGetProperty() 傳回一個值,指示是否可以讀取屬性。 yii\base\BaseObject
canSetProperty() 傳回一個值,指示是否可以設定屬性。 yii\base\BaseObject
checkIntegrity() 建立用於啟用或停用完整性檢查的 SQL 陳述式。 yii\db\mssql\QueryBuilder
className() 傳回此類別的完整限定名稱。 yii\base\BaseObject
createConditionFromArray() 根據 $conditionClasses 對應,將陣列格式定義的 $condition(如 yii\db\Query::where() 中所述)轉換為 yii\db\condition\ConditionInterface 的實例。 yii\db\QueryBuilder
createIndex() 建立用於建立新索引的 SQL 陳述式。 yii\db\QueryBuilder
createTable() 建立用於建立新的資料庫表格的 SQL 陳述式。 yii\db\QueryBuilder
createView() 建立 SQL 視圖。 yii\db\QueryBuilder
delete() 建立 DELETE SQL 陳述式。 yii\db\QueryBuilder
dropCheck() 建立用於移除檢查約束的 SQL 命令。 yii\db\QueryBuilder
dropColumn() 在刪除欄位之前移除所有約束 {@inheritdoc} yii\db\mssql\QueryBuilder
dropCommentFromColumn() 建構用於新增欄位註解的 SQL 命令。 yii\db\mssql\QueryBuilder
dropCommentFromTable() 建構用於新增表格註解的 SQL 命令。 yii\db\mssql\QueryBuilder
dropDefaultValue() 建立用於移除預設值約束的 SQL 命令。 yii\db\mssql\QueryBuilder
dropForeignKey() 建立用於移除外鍵約束的 SQL 陳述式。 yii\db\QueryBuilder
dropIndex() 建立用於移除索引的 SQL 陳述式。 yii\db\QueryBuilder
dropPrimaryKey() 建立用於從現有表格移除主鍵約束的 SQL 陳述式。 yii\db\QueryBuilder
dropTable() 建立用於移除資料庫表格的 SQL 陳述式。 yii\db\QueryBuilder
dropUnique() 建立用於移除唯一性約束的 SQL 命令。 yii\db\QueryBuilder
dropView() 移除 SQL 視圖。 yii\db\QueryBuilder
executeResetSequence() 執行 SQL 陳述式以重設表格主鍵的序列值。 yii\db\QueryBuilder
getColumnType() 將抽象欄位類型轉換為實體欄位類型。 yii\db\mssql\QueryBuilder
getExpressionBuilder() 取得適用於 $expression 的 yii\db\ExpressionBuilderInterface 物件。 yii\db\QueryBuilder
hasMethod() 傳回一個值,指示是否已定義方法。 yii\base\BaseObject
hasProperty() 傳回一個值,指示是否已定義屬性。 yii\base\BaseObject
init() 初始化物件。 yii\db\QueryBuilder
insert() {@inheritdoc} 為取得插入的資料新增 OUTPUT 結構 (適用於 SQL Server 2005 或更高版本) OUTPUT 子句 - OUTPUT 子句是 SQL Server 2005 的新功能,並且能夠存取 INSERTED 和 DELETED 表格,就像觸發程序一樣。 yii\db\mssql\QueryBuilder
renameColumn() 建立用於重新命名欄位的 SQL 陳述式。 yii\db\mssql\QueryBuilder
renameTable() 建立用於重新命名資料庫表格的 SQL 陳述式。 yii\db\mssql\QueryBuilder
resetSequence() 建立用於重設表格主鍵序列值的 SQL 陳述式。 yii\db\mssql\QueryBuilder
selectExists() 建立 SELECT EXISTS() SQL 陳述式。 yii\db\mssql\QueryBuilder
setConditionClasses() 設定 $conditionClasses 屬性。 yii\db\QueryBuilder
setExpressionBuilders() 設定 $expressionBuilders 屬性。 yii\db\QueryBuilder
truncateTable() 建立用於截斷資料庫表格的 SQL 陳述式。 yii\db\QueryBuilder
update() 建立 UPDATE SQL 陳述式。 yii\db\mssql\QueryBuilder
upsert() 建立 SQL 陳述式,以在資料庫表格中插入不存在的資料列(符合唯一性約束),如果存在則更新它們。 yii\db\mssql\QueryBuilder

Protected Methods

隱藏繼承的方法

方法 描述 定義於
buildAddCommentSql() 建立用於新增或更新表格或欄位註解的 SQL 命令。 建立的命令將檢查註解是否已存在。 如果是,它將被更新,否則將被新增。 yii\db\mssql\QueryBuilder
buildRemoveCommentSql() 建立用於從表格或欄位移除註解的 SQL 命令。 建立的命令將在嘗試執行移除之前檢查註解是否已存在。 yii\db\mssql\QueryBuilder
defaultConditionClasses() 包含預設條件類別的陣列。 如果您想要變更查詢產生器的預設條件類別,請擴展此方法。 請參閱 $conditionClasses 文件以取得詳細資訊。 yii\db\QueryBuilder
defaultExpressionBuilders() 包含預設表達式產生器的陣列。 如果您想要變更此查詢產生器的預設表達式產生器,請擴展並覆寫此方法。 請參閱 $expressionBuilders 文件以取得詳細資訊。 yii\db\mssql\QueryBuilder
extractAlias() 如果存在表格別名,則提取表格別名,否則傳回 false yii\db\mssql\QueryBuilder
getAllColumnNames() 傳回給定模型名稱的欄位名稱陣列。 yii\db\mssql\QueryBuilder
hasLimit() 檢查給定的 limit 是否有效。 yii\db\QueryBuilder
hasOffset() 檢查給定的 offset 是否有效。 yii\db\QueryBuilder
isOldMssql() yii\db\mssql\QueryBuilder
newBuildOrderByAndLimit() 為 SQL SERVER 2012 或更新版本建立 ORDER BY/LIMIT/OFFSET 子句。 yii\db\mssql\QueryBuilder
oldBuildOrderByAndLimit() 為 SQL SERVER 2005 至 2008 版本建立 ORDER BY/LIMIT/OFFSET 子句。 yii\db\mssql\QueryBuilder
prepareInsertSelectSubQuery() 為 INSERT INTO ... SELECT SQL 陳述式準備 select-subquery 和欄位名稱。 yii\db\QueryBuilder
prepareInsertValues() INSERT SQL 陳述式準備 VALUES 部分。 yii\db\QueryBuilder
prepareUpdateSets() UPDATE SQL 陳述式準備 SET 部分。 yii\db\QueryBuilder
prepareUpsertColumns() yii\db\QueryBuilder

Constants

Hide inherited constants

Constant Value 描述 定義於
PARAM_PREFIX ':qp' 自動產生的查詢繫結參數的前綴。 yii\db\QueryBuilder

Property Details

隱藏繼承的屬性

$typeMap public property

從抽象欄位類型(鍵)到物理欄位類型(值)的映射。

public array $typeMap = [
    \
yii\db\mssql\Schema::TYPE_PK => 'int IDENTITY PRIMARY KEY',
    \
yii\db\mssql\Schema::TYPE_UPK => 'int IDENTITY PRIMARY KEY',
    \
yii\db\mssql\Schema::TYPE_BIGPK => 'bigint IDENTITY PRIMARY KEY',
    \
yii\db\mssql\Schema::TYPE_UBIGPK => 'bigint IDENTITY PRIMARY KEY',
    \
yii\db\mssql\Schema::TYPE_CHAR => 'nchar(1)',
    \
yii\db\mssql\Schema::TYPE_STRING => 'nvarchar(255)',
    \
yii\db\mssql\Schema::TYPE_TEXT => 'nvarchar(max)',
    \
yii\db\mssql\Schema::TYPE_TINYINT => 'tinyint',
    \
yii\db\mssql\Schema::TYPE_SMALLINT => 'smallint',
    \
yii\db\mssql\Schema::TYPE_INTEGER => 'int',
    \
yii\db\mssql\Schema::TYPE_BIGINT => 'bigint',
    \
yii\db\mssql\Schema::TYPE_FLOAT => 'float',
    \
yii\db\mssql\Schema::TYPE_DOUBLE => 'float',
    \
yii\db\mssql\Schema::TYPE_DECIMAL => 'decimal(18,0)',
    \
yii\db\mssql\Schema::TYPE_DATETIME => 'datetime',
    \
yii\db\mssql\Schema::TYPE_TIMESTAMP => 'datetime',
    \
yii\db\mssql\Schema::TYPE_TIME => 'time',
    \
yii\db\mssql\Schema::TYPE_DATE => 'date',
    \
yii\db\mssql\Schema::TYPE_BINARY => 'varbinary(max)',
    \
yii\db\mssql\Schema::TYPE_BOOLEAN => 'bit',
    \
yii\db\mssql\Schema::TYPE_MONEY => 'decimal(19,4)',
]

Method Details

隱藏繼承的方法

__call() public method

Defined in: yii\base\BaseObject::__call()

調用指定的非類別方法。

請勿直接呼叫此方法,因為它是一個 PHP 魔術方法,當呼叫未知方法時,它會被隱式呼叫。

public mixed __call ( $name, $params )
$name 字串

方法名稱

$params 陣列

方法參數

return mixed

方法傳回值

throws yii\base\UnknownMethodException

當呼叫未知方法時

                public function __call($name, $params)
{
    throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
}

            
__construct() public method

Defined in: 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);
}

            
__get() public method

Defined in: yii\base\BaseObject::__get()

返回物件屬性的值。

請勿直接呼叫此方法,因為它是一個 PHP 魔術方法,當執行 $value = $object->property; 時,它會被隱式呼叫。

另請參閱 __set()

public mixed __get ( $name )
$name 字串

屬性名稱

return mixed

屬性值

throws yii\base\UnknownPropertyException

如果未定義屬性

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

            
__isset() public method

Defined in: yii\base\BaseObject::__isset()

檢查屬性是否已設定,即已定義且非 null。

請勿直接呼叫此方法,因為它是一個 PHP 魔術方法,當執行 isset($object->property) 時,它會被隱式呼叫。

請注意,如果未定義屬性,將傳回 false。

另請參閱 https://php.dev.org.tw/manual/en/function.isset.php

public boolean __isset ( $name )
$name 字串

屬性名稱或事件名稱

return boolean

具名屬性是否已設定(非 null)。

                public function __isset($name)
{
    $getter = 'get' . $name;
    if (method_exists($this, $getter)) {
        return $this->$getter() !== null;
    }
    return false;
}

            
__set() public method

Defined in: yii\base\BaseObject::__set()

設定物件屬性的值。

請勿直接呼叫此方法,因為它是一個 PHP 魔術方法,當執行 $object->property = $value; 時,它會被隱式呼叫。

另請參閱 __get()

public void __set ( $name, $value )
$name 字串

屬性名稱或事件名稱

$value mixed

屬性值

throws yii\base\UnknownPropertyException

如果未定義屬性

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

            
__unset() public method

Defined in: yii\base\BaseObject::__unset()

將物件屬性設定為 null。

請勿直接呼叫此方法,因為它是一個 PHP 魔術方法,當執行 unset($object->property) 時,它會被隱式呼叫。

請注意,如果未定義屬性,此方法將不執行任何操作。 如果屬性為唯讀,它將拋出例外。

另請參閱 https://php.dev.org.tw/manual/en/function.unset.php

public void __unset ( $name )
$name 字串

屬性名稱

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

            
addCheck() public method (available since version 2.0.13)

Defined in: yii\db\QueryBuilder::addCheck()

建立用於將檢查約束新增到現有表格的 SQL 命令。

public string addCheck ( $name, $table, $expression )
$name 字串

$name

$table 字串

將在其中新增檢查約束的表格。 名稱將由方法正確地加上引號。

$expression 字串

CHECK 約束的 SQL。

return 字串

用於將檢查約束新增到現有表格的 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) . ')';
}

            
addColumn() public method

Defined in: 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'。

return 字串

用於新增新欄位的 SQL 陳述式。

                public function addColumn($table, $column, $type)
{
    return 'ALTER TABLE ' . $this->db->quoteTableName($table)
        . ' ADD ' . $this->db->quoteColumnName($column) . ' '
        . $this->getColumnType($type);
}

            
addCommentOnColumn() public method (available since version 2.0.8)

建構用於新增欄位註解的 SQL 命令。

public string addCommentOnColumn ( $table, $column, $comment )
$table 字串

$table

$column 字串

$column

$comment 字串

要新增的註解文字。 註解將由方法正確地加上引號。

return 字串

用於在欄位上新增註解的 SQL 陳述式

                public function addCommentOnColumn($table, $column, $comment)
{
    return $this->buildAddCommentSql($comment, $table, $column);
}

            
addCommentOnTable() public method (available since version 2.0.8)

建構用於新增表格註解的 SQL 命令。

public string addCommentOnTable ( $table, $comment )
$table 字串

$table

$comment 字串

要新增的註解文字。 註解將由方法正確地加上引號。

return 字串

用於在表格上新增註解的 SQL 陳述式

                public function addCommentOnTable($table, $comment)
{
    return $this->buildAddCommentSql($comment, $table);
}

            
addDefaultValue() public method (available since version 2.0.13)

建立用於將預設值約束新增到現有表格的 SQL 命令。

public string addDefaultValue ( $name, $table, $column, $value )
$name 字串

$name

$table 字串

$table

$column 字串

$column

$value mixed

$value

return 字串

用於將預設值約束新增到現有表格的 SQL 陳述式。

throws yii\base\NotSupportedException

如果底層 DBMS 不支援此功能。

                public function addDefaultValue($name, $table, $column, $value)
{
    return 'ALTER TABLE ' . $this->db->quoteTableName($table) . ' ADD CONSTRAINT '
        . $this->db->quoteColumnName($name) . ' DEFAULT ' . $this->db->quoteValue($value) . ' FOR '
        . $this->db->quoteColumnName($column);
}

            
addForeignKey() public method

Defined in: yii\db\QueryBuilder::addForeignKey()

建構用於將外鍵約束新增到現有表格的 SQL 語句。

此方法將正確地為表格和欄位名稱加上引號。

public string addForeignKey ( $name, $table, $columns, $refTable, $refColumns, $delete null, $update null )
$name 字串

$name

$table 字串

$table

$columns string|array

將在其中新增約束的欄位名稱。 如果有多個欄位,請用逗號分隔或使用陣列表示它們。

$refTable 字串

$refColumns

$refColumns string|array

外鍵參考的欄位名稱。 如果有多個欄位,請用逗號分隔或使用陣列表示它們。

$delete string|null

$update

$update string|null

ON UPDATE 選項。 大多數 DBMS 支援以下選項:RESTRICT、CASCADE、NO ACTION、SET DEFAULT、SET NULL

return 字串

用於將外鍵約束新增到現有表格的 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) {
        $sql .= ' ON UPDATE ' . $update;
    }
    return $sql;
}

            
addPrimaryKey() public method

Defined in: yii\db\QueryBuilder::addPrimaryKey()

建構用於將主鍵約束新增到現有表格的 SQL 語句。

public string addPrimaryKey ( $name, $table, $columns )
$name 字串

主索引鍵約束的名稱。

$table 字串

將加入主索引鍵約束的表格。

$columns string|array

主索引鍵將包含的以逗號分隔的字串或欄位陣列。

return 字串

用於將主索引鍵約束新增至現有表格的 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) . ')';
}

            
addUnique() 公有方法 (自版本 2.0.13 起可用)

定義於: yii\db\QueryBuilder::addUnique()

建立用於將唯一約束新增到現有表格的 SQL 命令。

public string addUnique ( $name, $table, $columns )
$name 字串

唯一性約束的名稱。名稱將由方法正確地加上引號。

$table 字串

將加入唯一性約束的表格。名稱將由方法正確地加上引號。

$columns string|array

將在其上加入約束的欄位名稱。 如果有多個欄位,請用逗號分隔它們。 名稱將由方法正確地加上引號。

return 字串

用於將唯一性約束新增至現有表格的 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) . ')';
}

            
alterColumn() 公有方法

建構用於更改欄位定義的 SQL 語句。

public string alterColumn ( $table, $column, $type )
$table 字串

要變更其欄位的表格。 表格名稱將由方法正確地加上引號。

$column 字串

要變更的欄位名稱。 名稱將由方法正確地加上引號。

$type 字串

新的欄位類型。 將調用 getColumnType() 方法來將抽象欄位類型(如果有的話)轉換為實體欄位類型。 任何未被識別為抽象類型的內容都將保留在產生的 SQL 中。 例如,'string' 將變成 'varchar(255)',而 'string not null' 將變成 'varchar(255) not null'。

return 字串

用於變更欄位定義的 SQL 陳述式。

throws yii\base\NotSupportedException

如果底層 DBMS 不支援此功能。

                public function alterColumn($table, $column, $type)
{
    $sqlAfter = [$this->dropConstraintsForColumn($table, $column, 'D')];
    $columnName = $this->db->quoteColumnName($column);
    $tableName = $this->db->quoteTableName($table);
    $constraintBase = preg_replace('/[^a-z0-9_]/i', '', $table . '_' . $column);
    if ($type instanceof \yii\db\mssql\ColumnSchemaBuilder) {
        $type->setAlterColumnFormat();
        $defaultValue = $type->getDefaultValue();
        if ($defaultValue !== null) {
            $sqlAfter[] = $this->addDefaultValue(
                "DF_{$constraintBase}",
                $table,
                $column,
                $defaultValue instanceof Expression ? $defaultValue : new Expression($defaultValue)
            );
        }
        $checkValue = $type->getCheckValue();
        if ($checkValue !== null) {
            $sqlAfter[] = "ALTER TABLE {$tableName} ADD CONSTRAINT " .
                $this->db->quoteColumnName("CK_{$constraintBase}") .
                ' CHECK (' . ($defaultValue instanceof Expression ?  $checkValue : new Expression($checkValue)) . ')';
        }
        if ($type->isUnique()) {
            $sqlAfter[] = "ALTER TABLE {$tableName} ADD CONSTRAINT " . $this->db->quoteColumnName("UQ_{$constraintBase}") . " UNIQUE ({$columnName})";
        }
    }
    return 'ALTER TABLE ' . $tableName . ' ALTER COLUMN '
        . $columnName . ' '
        . $this->getColumnType($type) . "\n"
        . implode("\n", $sqlAfter);
}

            
batchInsert() 公有方法

定義於: yii\db\QueryBuilder::batchInsert()

產生批次 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 陣列

繫結參數。 此參數自 2.0.14 版本起存在

return 字串

批量 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);
    }
    return 'INSERT INTO ' . $schema->quoteTableName($table)
        . ' (' . implode(', ', $columns) . ') VALUES ' . implode(', ', $values);
}

            
bindParam() 公有方法 (自版本 2.0.14 起可用)

定義於: yii\db\QueryBuilder::bindParam()

輔助方法,使用 PARAM_PREFIX 將 $value 新增到 $params 陣列。

public string bindParam ( $value, &$params )
$value string|null
$params 陣列

以參考方式傳遞

return 字串

$params 陣列中的預留位置名稱

                public function bindParam($value, &$params)
{
    $phName = self::PARAM_PREFIX . count($params);
    $params[$phName] = $value;
    return $phName;
}

            
build() 公有方法

定義於: yii\db\QueryBuilder::build()

yii\db\Query 物件產生 SELECT SQL 陳述式。

public array build ( $query, $params = [] )
$query yii\db\Query

將從中產生 SQL 陳述式的 yii\db\Query 物件。

$params 陣列

要繫結到產生的 SQL 陳述式的參數。 這些參數將與查詢建置過程中產生的其他參數一起包含在結果中。

return 陣列

產生的 SQL 陳述式(第一個陣列元素)和要繫結到 SQL 陳述式的對應參數(第二個陣列元素)。 返回的參數包括在 $params 中提供的參數。

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

            
buildAddCommentSql() 受保護方法 (自版本 2.0.24 起可用)

建立用於新增或更新表格或欄位註解的 SQL 命令。 建立的命令將檢查註解是否已存在。 如果是,它將被更新,否則將被新增。

protected string buildAddCommentSql ( $comment, $table, $column null )
$comment 字串

要新增的註解文字。 註解將由方法正確地加上引號。

$table 字串

要註解或要註解其欄位的表格。 表格名稱將由方法正確地加上引號。

$column string|null

選填。 要註解的欄位名稱。 如果為空,則命令會改為將註解新增至表格。 欄位名稱將由方法正確地加上引號。

return 字串

用於新增註解的 SQL 陳述式。

throws yii\base\InvalidArgumentException

如果表格不存在。

                protected function buildAddCommentSql($comment, $table, $column = null)
{
    $tableSchema = $this->db->schema->getTableSchema($table);
    if ($tableSchema === null) {
        throw new InvalidArgumentException("Table not found: $table");
    }
    $schemaName = $tableSchema->schemaName ? "N'" . $tableSchema->schemaName . "'" : 'SCHEMA_NAME()';
    $tableName = 'N' . $this->db->quoteValue($tableSchema->name);
    $columnName = $column ? 'N' . $this->db->quoteValue($column) : null;
    $comment = 'N' . $this->db->quoteValue($comment);
    $functionParams = "
        @name = N'MS_description',
        @value = $comment,
        @level0type = N'SCHEMA', @level0name = $schemaName,
        @level1type = N'TABLE', @level1name = $tableName"
        . ($column ? ", @level2type = N'COLUMN', @level2name = $columnName" : '') . ';';
    return "
        IF NOT EXISTS (
                SELECT 1
                FROM fn_listextendedproperty (
                    N'MS_description',
                    'SCHEMA', $schemaName,
                    'TABLE', $tableName,
                    " . ($column ? "'COLUMN', $columnName " : ' DEFAULT, DEFAULT ') . "
                )
        )
            EXEC sys.sp_addextendedproperty $functionParams
        ELSE
            EXEC sys.sp_updateextendedproperty $functionParams
    ";
}

            
buildAndCondition() 公有方法
自 2.0.14 版本起已棄用。 請改用 buildCondition()

定義於: yii\db\QueryBuilder::buildAndCondition()

使用 ANDOR 運算子連接兩個或多個 SQL 表達式。

public string buildAndCondition ( $operator, $operands, &$params )
$operator 字串

用於連接給定運算元的運算子

$operands 陣列

要連接的 SQL 運算式。

$params 陣列

要填入的繫結參數

return 字串

產生的 SQL 運算式

                public function buildAndCondition($operator, $operands, &$params)
{
    array_unshift($operands, $operator);
    return $this->buildCondition($operands, $params);
}

            
buildBetweenCondition() 公有方法
自 2.0.14 版本起已棄用。 請改用 buildCondition()

定義於: yii\db\QueryBuilder::buildBetweenCondition()

建立使用 BETWEEN 運算子的 SQL 表達式。

public string buildBetweenCondition ( $operator, $operands, &$params )
$operator 字串

要使用的運算子(例如 BETWEENNOT BETWEEN

$operands 陣列

第一個運算元是欄位名稱。 第二個和第三個運算元描述欄位值應在的間隔。

$params 陣列

要填入的繫結參數

return 字串

產生的 SQL 運算式

throws yii\base\InvalidArgumentException

如果給定的運算元數量錯誤。

                public function buildBetweenCondition($operator, $operands, &$params)
{
    array_unshift($operands, $operator);
    return $this->buildCondition($operands, $params);
}

            
buildColumns() 公有方法

定義於: yii\db\QueryBuilder::buildColumns()

處理欄位,並在必要時正確地加上引號。

它將把所有欄位合併為一個字串,並以逗號作為分隔符。

public string buildColumns ( $columns )
$columns string|array

要處理的欄位

return 字串

處理結果

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

            
buildCondition() 公有方法

定義於: yii\db\QueryBuilder::buildCondition()

解析條件規格並產生對應的 SQL 表達式。

public string buildCondition ( $condition, &$params )
$condition string|array|yii\db\ExpressionInterface

條件規格。 請參閱 yii\db\Query::where() 以了解如何指定條件。

$params 陣列

要填入的繫結參數

return 字串

產生的 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;
}

            
buildExistsCondition() 公有方法
自 2.0.14 版本起已棄用。 請改用 buildCondition()

定義於: yii\db\QueryBuilder::buildExistsCondition()

建立使用 EXISTS 運算子的 SQL 表達式。

public string buildExistsCondition ( $operator, $operands, &$params )
$operator 字串

要使用的運算子(例如 EXISTSNOT EXISTS

$operands 陣列

僅包含一個元素,即代表子查詢的 yii\db\Query 物件。

$params 陣列

要填入的繫結參數

return 字串

產生的 SQL 運算式

throws yii\base\InvalidArgumentException

如果運算元不是 yii\db\Query 物件。

                public function buildExistsCondition($operator, $operands, &$params)
{
    array_unshift($operands, $operator);
    return $this->buildCondition($operands, $params);
}

            
buildExpression() 公有方法 (自版本 2.0.14 起可用)
public yii\db\ExpressionInterface buildExpression ( yii\db\ExpressionInterface $expression, &$params = [] )
$expression yii\db\ExpressionInterface

要建置的運算式

$params 陣列

要繫結到產生的 SQL 陳述式的參數。 這些參數將與運算式建置過程中產生的其他參數一起包含在結果中。

return 字串

在傳遞到 DBMS 之前,既不會加上引號也不會編碼的 SQL 陳述式

throws yii\base\InvalidArgumentException

當此 QueryBuilder 不支援 $expression 建置時。

                public function buildExpression(ExpressionInterface $expression, &$params = [])
{
    $builder = $this->getExpressionBuilder($expression);
    return $builder->build($expression, $params);
}

            
buildFrom() 公有方法
public string buildFrom ( $tables, &$params )
$tables 陣列
$params 陣列

要填入的繫結參數

return 字串

從 yii\db\Query::$from 建置的 FROM 子句。

                public function buildFrom($tables, &$params)
{
    if (empty($tables)) {
        return '';
    }
    $tables = $this->quoteTableNames($tables, $params);
    return 'FROM ' . implode(', ', $tables);
}

            
buildGroupBy() 公有方法
public string buildGroupBy ( $columns )
$columns 陣列
return 字串

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

            
buildHashCondition() 公有方法
自 2.0.14 版本起已棄用。 請改用 buildCondition()

定義於: yii\db\QueryBuilder::buildHashCondition()

根據欄位-值配對建立條件。

public string buildHashCondition ( $condition, &$params )
$condition 陣列

條件規格。

$params 陣列

要填入的繫結參數

return 字串

產生的 SQL 運算式

                public function buildHashCondition($condition, &$params)
{
    return $this->buildCondition(new HashCondition($condition), $params);
}

            
buildHaving() 公有方法
public string buildHaving ( $condition, &$params )
$condition string|array
$params 陣列

要填入的繫結參數

return 字串

從 yii\db\Query::$having 建置的 HAVING 子句。

                public function buildHaving($condition, &$params)
{
    $having = $this->buildCondition($condition, $params);
    return $having === '' ? '' : 'HAVING ' . $having;
}

            
buildInCondition() 公有方法
自 2.0.14 版本起已棄用。 請改用 buildCondition()

定義於: yii\db\QueryBuilder::buildInCondition()

建立使用 IN 運算子的 SQL 表達式。

public string buildInCondition ( $operator, $operands, &$params )
$operator 字串

要使用的運算子(例如 INNOT IN

$operands 陣列

第一個運算元是欄位名稱。 如果它是一個陣列,將產生複合 IN 條件。 第二個運算元是欄位值應包含在內的值陣列。 如果它是一個空陣列,則如果運算子為 IN,則產生的運算式將為 false 值,如果運算子為 NOT IN,則為空。

$params 陣列

要填入的繫結參數

return 字串

產生的 SQL 運算式

throws yii\db\Exception

如果給定的運算元數量錯誤。

                public function buildInCondition($operator, $operands, &$params)
{
    array_unshift($operands, $operator);
    return $this->buildCondition($operands, $params);
}

            
buildJoin() 公有方法
public string buildJoin ( $joins, &$params )
$joins 陣列
$params 陣列

要填入的繫結參數

return 字串

從 yii\db\Query::$join 建置的 JOIN 子句。

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

            
buildLikeCondition() 公有方法
自 2.0.14 版本起已棄用。 請改用 buildCondition()

定義於: yii\db\QueryBuilder::buildLikeCondition()

建立使用 LIKE 運算子的 SQL 表達式。

public string buildLikeCondition ( $operator, $operands, &$params )
$operator 字串

要使用的運算子(例如 LIKENOT LIKEOR LIKEOR NOT LIKE

$operands 陣列

包含兩個或三個運算元的陣列

  • 第一個運算元是欄位名稱。
  • 第二個運算元是單個值或欄位值應與之比較的數值陣列。 如果它是一個空陣列,則如果運算子為 LIKEOR LIKE,則產生的運算式將為 false 值;如果運算子為 NOT LIKEOR NOT LIKE,則為空。
  • 還可以提供選填的第三個運算元,以指定如何跳脫值中的特殊字元。 運算元應為從特殊字元到其跳脫對應項的對應陣列。 如果未提供此運算元,將使用預設跳脫對應。 您可以使用 false 或空陣列來表示值已跳脫,且不應套用任何跳脫。 請注意,當使用跳脫對應(或未提供第三個運算元)時,這些值將自動包含在一對百分比字元內。
$params 陣列

要填入的繫結參數

return 字串

產生的 SQL 運算式

throws yii\base\InvalidArgumentException

如果給定的運算元數量錯誤。

                public function buildLikeCondition($operator, $operands, &$params)
{
    array_unshift($operands, $operator);
    return $this->buildCondition($operands, $params);
}

            
buildLimit() 公有方法
public string buildLimit ( $limit, $offset )
$limit integer
$offset integer
return 字串

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

            
buildNotCondition() 公有方法
自 2.0.14 版本起已棄用。 請改用 buildCondition()

定義於: yii\db\QueryBuilder::buildNotCondition()

使用 NOT 運算子反轉 SQL 表達式。

public string buildNotCondition ( $operator, $operands, &$params )
$operator 字串

用於連接給定運算元的運算子

$operands 陣列

要連接的 SQL 運算式。

$params 陣列

要填入的繫結參數

return 字串

產生的 SQL 運算式

throws yii\base\InvalidArgumentException

如果給定的運算元數量錯誤。

                public function buildNotCondition($operator, $operands, &$params)
{
    array_unshift($operands, $operator);
    return $this->buildCondition($operands, $params);
}

            
buildOrderBy() 公有方法
public string buildOrderBy ( $columns )
$columns 陣列
return 字串

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

            
buildOrderByAndLimit() 公有方法

建立 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()。

return 字串

完成 ORDER BY/LIMIT/OFFSET 的 SQL(如果有的話)

                public function buildOrderByAndLimit($sql, $orderBy, $limit, $offset)
{
    if (!$this->hasOffset($offset) && !$this->hasLimit($limit)) {
        $orderBy = $this->buildOrderBy($orderBy);
        return $orderBy === '' ? $sql : $sql . $this->separator . $orderBy;
    }
    if (version_compare($this->db->getSchema()->getServerVersion(), '11', '<')) {
        return $this->oldBuildOrderByAndLimit($sql, $orderBy, $limit, $offset);
    }
    return $this->newBuildOrderByAndLimit($sql, $orderBy, $limit, $offset);
}

            
buildRemoveCommentSql() 受保護方法 (自版本 2.0.24 起可用)

建立用於從表格或欄位移除註解的 SQL 命令。 建立的命令將在嘗試執行移除之前檢查註解是否已存在。

protected string buildRemoveCommentSql ( $table, $column null )
$table 字串

將移除註解的表格或將移除註解的欄位所屬的表格。 表格名稱將由方法正確地加上引號。

$column string|null

選填。 將移除註解的欄位名稱。 如果為空,則命令會改為從表格中移除註解。 欄位名稱將由方法正確地加上引號。

return 字串

用於移除註解的 SQL 陳述式。

throws yii\base\InvalidArgumentException

如果表格不存在。

                protected function buildRemoveCommentSql($table, $column = null)
{
    $tableSchema = $this->db->schema->getTableSchema($table);
    if ($tableSchema === null) {
        throw new InvalidArgumentException("Table not found: $table");
    }
    $schemaName = $tableSchema->schemaName ? "N'" . $tableSchema->schemaName . "'" : 'SCHEMA_NAME()';
    $tableName = 'N' . $this->db->quoteValue($tableSchema->name);
    $columnName = $column ? 'N' . $this->db->quoteValue($column) : null;
    return "
        IF EXISTS (
                SELECT 1
                FROM fn_listextendedproperty (
                    N'MS_description',
                    'SCHEMA', $schemaName,
                    'TABLE', $tableName,
                    " . ($column ? "'COLUMN', $columnName " : ' DEFAULT, DEFAULT ') . "
                )
        )
            EXEC sys.sp_dropextendedproperty
                @name = N'MS_description',
                @level0type = N'SCHEMA', @level0name = $schemaName,
                @level1type = N'TABLE', @level1name = $tableName"
                . ($column ? ", @level2type = N'COLUMN', @level2name = $columnName" : '') . ';';
}

            
buildSelect() 公有方法
public string buildSelect ( $columns, &$params, $distinct false, $selectOption null )
$columns 陣列
$params 陣列

要填入的繫結參數

$distinct boolean
$selectOption string|null
return 字串

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

            
buildSimpleCondition() public method
自 2.0.14 版本起已棄用。 請改用 buildCondition()

定義於: yii\db\QueryBuilder::buildSimpleCondition()

建立類似 "column" operator value 的 SQL 表達式。

public string buildSimpleCondition ( $operator, $operands, &$params )
$operator 字串

要使用的運算子。可以使用任何符號,例如 ><= 等。

$operands 陣列

包含兩個資料行名稱。

$params 陣列

要填入的繫結參數

return 字串

產生的 SQL 運算式

throws yii\base\InvalidArgumentException

如果給定的運算元數量錯誤。

                public function buildSimpleCondition($operator, $operands, &$params)
{
    array_unshift($operands, $operator);
    return $this->buildCondition($operands, $params);
}

            
buildUnion() public method
public string buildUnion ( $unions, &$params )
$unions 陣列
$params 陣列

要填入的繫結參數

return 字串

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

            
buildWhere() public method
public string buildWhere ( $condition, &$params )
$condition string|array
$params 陣列

要填入的繫結參數

return 字串

yii\db\Query::$where 建構的 WHERE 子句。

                public function buildWhere($condition, &$params)
{
    $where = $this->buildCondition($condition, $params);
    return $where === '' ? '' : 'WHERE ' . $where;
}

            
buildWithQueries() public method (自 2.0.35 版本起可用)
public string buildWithQueries ( $withs, &$params )
$withs 陣列

每個 WITH 查詢的組態

$params 陣列

要填入的繫結參數

return 字串

編譯後的 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);
}

            
canGetProperty() public method

定義於: yii\base\BaseObject::canGetProperty()

傳回一個值,指示是否可以讀取屬性。

如果符合以下條件,屬性是可讀的:

  • 類別具有與指定名稱相關聯的 getter 方法(在這種情況下,屬性名稱不區分大小寫);
  • 類別具有具有指定名稱的成員變數(當 $checkVars 為 true 時);

另請參閱 canSetProperty()

public boolean canGetProperty ( $name, $checkVars true )
$name 字串

屬性名稱

$checkVars boolean

是否將成員變數視為屬性

return boolean

屬性是否可讀

                public function canGetProperty($name, $checkVars = true)
{
    return method_exists($this, 'get' . $name) || $checkVars && property_exists($this, $name);
}

            
canSetProperty() public method

定義於: yii\base\BaseObject::canSetProperty()

傳回一個值,指示是否可以設定屬性。

如果符合以下條件,屬性是可寫入的:

  • 類別具有與指定名稱相關聯的 setter 方法(在這種情況下,屬性名稱不區分大小寫);
  • 類別具有具有指定名稱的成員變數(當 $checkVars 為 true 時);

另請參閱 canGetProperty()

public boolean canSetProperty ( $name, $checkVars true )
$name 字串

屬性名稱

$checkVars boolean

是否將成員變數視為屬性

return boolean

屬性是否可寫入

                public function canSetProperty($name, $checkVars = true)
{
    return method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name);
}

            
checkIntegrity() public method

建立用於啟用或停用完整性檢查的 SQL 陳述式。

public string checkIntegrity ( $check true, $schema '', $table '' )
$check boolean

是否開啟或關閉完整性檢查。

$schema 字串

資料表的結構描述。

$table 字串

資料表名稱。

return 字串

用於檢查完整性的 SQL 陳述式

                public function checkIntegrity($check = true, $schema = '', $table = '')
{
    $enable = $check ? 'CHECK' : 'NOCHECK';
    $schema = $schema ?: $this->db->getSchema()->defaultSchema;
    $tableNames = $this->db->getTableSchema($table) ? [$table] : $this->db->getSchema()->getTableNames($schema);
    $viewNames = $this->db->getSchema()->getViewNames($schema);
    $tableNames = array_diff($tableNames, $viewNames);
    $command = '';
    foreach ($tableNames as $tableName) {
        $tableName = $this->db->quoteTableName("{$schema}.{$tableName}");
        $command .= "ALTER TABLE $tableName $enable CONSTRAINT ALL; ";
    }
    return $command;
}

            
className() public static method
自 2.0.14 版本起已過時。在 PHP >=5.5 上,請改用 ::class

定義於: yii\base\BaseObject::className()

傳回此類別的完整限定名稱。

public static string className ( )
return 字串

此類別的完整限定名稱。

                public static function className()
{
    return get_called_class();
}

            
createConditionFromArray() public method (自 2.0.14 版本起可用)

定義於: yii\db\QueryBuilder::createConditionFromArray()

根據 $conditionClasses 對應,將陣列格式定義的 $condition(如 yii\db\Query::where() 中所述)轉換為 yii\db\condition\ConditionInterface 的實例。

另請參閱 $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);
}

            
createIndex() public method

定義於: yii\db\QueryBuilder::createIndex()

建立用於建立新索引的 SQL 陳述式。

public string createIndex ( $name, $table, $columns, $unique false )
$name 字串

索引的名稱。名稱將由此方法正確地引用。

$table 字串

將在其中建立新索引的資料表。資料表名稱將由此方法正確地引用。

$columns string|array

應包含在索引中的資料行。如果有多個資料行,請用逗號分隔或使用陣列來表示。每個資料行名稱將由此方法正確地引用,除非在名稱中找到括號。

$unique boolean

是否在新建立的索引上新增 UNIQUE 條件約束。

return 字串

用於建立新索引的 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) . ')';
}

            
createTable() public method

定義於: yii\db\QueryBuilder::createTable()

建立用於建立新的資料庫表格的 SQL 陳述式。

新資料表中的資料行應指定為名稱-定義配對(例如 'name' => 'string'),其中 name 代表資料行名稱,該名稱將由此方法正確地引用,而 definition 代表資料行類型,其中必須包含抽象 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 陣列

新資料表中的資料行(name => definition)。

$options string|null

將附加到產生的 SQL 的其他 SQL 片段。

return 字串

用於建立新 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;
}

            
createView() public method (自 2.0.14 版本起可用)

定義於: yii\db\QueryBuilder::createView()

建立 SQL 視圖。

public string createView ( $viewName, $subQuery )
$viewName 字串

要建立的檢視表名稱。

$subQuery string|yii\db\Query

定義檢視表的 select 陳述式。這可以是字串或 yii\db\Query 物件。

return 字串

CREATE VIEW SQL 陳述式。

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

            
defaultConditionClasses() protected method (自 2.0.14 版本起可用)

定義於: 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',
    ];
}

            
defaultExpressionBuilders() protected method (自 2.0.14 版本起可用)

包含預設表達式產生器的陣列。 如果您想要變更此查詢產生器的預設表達式產生器,請擴展並覆寫此方法。 請參閱 $expressionBuilders 文件以取得詳細資訊。

protected array defaultExpressionBuilders ( )

                protected function defaultExpressionBuilders()
{
    return array_merge(parent::defaultExpressionBuilders(), [
        'yii\db\conditions\InCondition' => 'yii\db\mssql\conditions\InConditionBuilder',
        'yii\db\conditions\LikeCondition' => 'yii\db\mssql\conditions\LikeConditionBuilder',
    ]);
}

            
delete() public method

定義於: 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 命令。

return 字串

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

            
dropCheck() public method (自 2.0.13 版本起可用)

定義於: yii\db\QueryBuilder::dropCheck()

建立用於移除檢查約束的 SQL 命令。

public string dropCheck ( $name, $table )
$name 字串

要刪除的檢查條件約束的名稱。名稱將由此方法正確地引用。

$table 字串

要刪除其檢查條件約束的資料表。名稱將由此方法正確地引用。

return 字串

用於刪除檢查條件約束的 SQL 陳述式。

                public function dropCheck($name, $table)
{
    return 'ALTER TABLE ' . $this->db->quoteTableName($table)
        . ' DROP CONSTRAINT ' . $this->db->quoteColumnName($name);
}

            
dropColumn() public method

在刪除欄位之前移除所有約束 {@inheritdoc}

public void dropColumn ( $table, $column )
$table
$column

                public function dropColumn($table, $column)
{
    return $this->dropConstraintsForColumn($table, $column) . "\nALTER TABLE " . $this->db->quoteTableName($table)
        . ' DROP COLUMN ' . $this->db->quoteColumnName($column);
}

            
dropCommentFromColumn() public method (自 2.0.8 版本起可用)

建構用於新增欄位註解的 SQL 命令。

public string dropCommentFromColumn ( $table, $column )
$table 字串

$table

$column 字串

$column

return 字串

用於在欄位上新增註解的 SQL 陳述式

                public function dropCommentFromColumn($table, $column)
{
    return $this->buildRemoveCommentSql($table, $column);
}

            
dropCommentFromTable() public method (自 2.0.8 版本起可用)

建構用於新增表格註解的 SQL 命令。

public string dropCommentFromTable ( $table )
$table 字串

$table

return 字串

用於在欄位上新增註解的 SQL 陳述式

                public function dropCommentFromTable($table)
{
    return $this->buildRemoveCommentSql($table);
}

            
dropDefaultValue() public method (自 2.0.13 版本起可用)

建立用於移除預設值約束的 SQL 命令。

public string dropDefaultValue ( $name, $table )
$name 字串

要刪除的預設值條件約束的名稱。名稱將由此方法正確地引用。

$table 字串

要刪除其預設值條件約束的資料表。名稱將由此方法正確地引用。

return 字串

用於刪除預設值條件約束的 SQL 陳述式。

throws yii\base\NotSupportedException

如果底層 DBMS 不支援此功能。

                public function dropDefaultValue($name, $table)
{
    return 'ALTER TABLE ' . $this->db->quoteTableName($table)
        . ' DROP CONSTRAINT ' . $this->db->quoteColumnName($name);
}

            
dropForeignKey() public method

定義於: yii\db\QueryBuilder::dropForeignKey()

建立用於移除外鍵約束的 SQL 陳述式。

public string dropForeignKey ( $name, $table )
$name 字串

要刪除的外鍵條件約束的名稱。名稱將由此方法正確地引用。

$table 字串

要刪除其外鍵的資料表。名稱將由此方法正確地引用。

return 字串

用於刪除外鍵條件約束的 SQL 陳述式。

                public function dropForeignKey($name, $table)
{
    return 'ALTER TABLE ' . $this->db->quoteTableName($table)
        . ' DROP CONSTRAINT ' . $this->db->quoteColumnName($name);
}

            
dropIndex() public method

定義於: yii\db\QueryBuilder::dropIndex()

建立用於移除索引的 SQL 陳述式。

public string dropIndex ( $name, $table )
$name 字串

要刪除的索引名稱。名稱將由此方法正確地引用。

$table 字串

要刪除其索引的資料表。名稱將由此方法正確地引用。

return 字串

用於刪除索引的 SQL 陳述式。

                public function dropIndex($name, $table)
{
    return 'DROP INDEX ' . $this->db->quoteTableName($name) . ' ON ' . $this->db->quoteTableName($table);
}

            
dropPrimaryKey() public method

定義於: yii\db\QueryBuilder::dropPrimaryKey()

建立用於從現有表格移除主鍵約束的 SQL 陳述式。

public string dropPrimaryKey ( $name, $table )
$name 字串

要移除的主鍵條件約束的名稱。

$table 字串

將從中移除主鍵條件約束的資料表。

return 字串

用於從現有資料表中移除主鍵條件約束的 SQL 陳述式。

                public function dropPrimaryKey($name, $table)
{
    return 'ALTER TABLE ' . $this->db->quoteTableName($table)
        . ' DROP CONSTRAINT ' . $this->db->quoteColumnName($name);
}

            
dropTable() public method

定義於: yii\db\QueryBuilder::dropTable()

建立用於移除資料庫表格的 SQL 陳述式。

public string dropTable ( $table )
$table 字串

要刪除的資料表。名稱將由此方法正確地引用。

return 字串

用於刪除 DB 資料表的 SQL 陳述式。

                public function dropTable($table)
{
    return 'DROP TABLE ' . $this->db->quoteTableName($table);
}

            
dropUnique() public method (自 2.0.13 版本起可用)

定義於: yii\db\QueryBuilder::dropUnique()

建立用於移除唯一性約束的 SQL 命令。

public string dropUnique ( $name, $table )
$name 字串

要刪除的唯一性條件約束的名稱。名稱將由此方法正確地引用。

$table 字串

要刪除其唯一性條件約束的資料表。名稱將由此方法正確地引用。

return 字串

用於刪除唯一性條件約束的 SQL 陳述式。

                public function dropUnique($name, $table)
{
    return 'ALTER TABLE ' . $this->db->quoteTableName($table)
        . ' DROP CONSTRAINT ' . $this->db->quoteColumnName($name);
}

            
dropView() public method (自 2.0.14 版本起可用)

定義於: yii\db\QueryBuilder::dropView()

移除 SQL 視圖。

public string dropView ( $viewName )
$viewName 字串

要刪除的檢視表名稱。

return 字串

DROP VIEW SQL 陳述式。

                public function dropView($viewName)
{
    return 'DROP VIEW ' . $this->db->quoteTableName($viewName);
}

            
executeResetSequence() public method (available since version 2.0.16)

Defined in: yii\db\QueryBuilder::executeResetSequence()

執行 SQL 陳述式以重設表格主鍵的序列值。

執行 execute 的原因是某些資料庫 (Oracle) 需要數個查詢才能完成此操作。 序列重設後,下一個插入的新資料列的主鍵將具有指定的值,或現有最大值 +1。

public void executeResetSequence ( $table, $value null )
$table 字串

要重設主鍵序列的資料表名稱

$value array|string|null

下一個插入的新資料列的主鍵值。 如果未設定,則下一個新資料列的主鍵將為現有最大值 +1。

throws yii\base\NotSupportedException

如果底層 DBMS 不支援此功能

                public function executeResetSequence($table, $value = null)
{
    $this->db->createCommand()->resetSequence($table, $value)->execute();
}

            
extractAlias() protected method (available since version 2.0.24)

如果存在表格別名,則提取表格別名,否則傳回 false

protected boolean|array extractAlias ( $table )
$table

                protected function extractAlias($table)
{
    if (preg_match('/^\[.*\]$/', $table)) {
        return false;
    }
    return parent::extractAlias($table);
}

            
getAllColumnNames() protected method

傳回給定模型名稱的欄位名稱陣列。

protected array|null getAllColumnNames ( $modelClass null )
$modelClass string|null

模型類別的名稱

return array|null

欄位名稱陣列

                protected function getAllColumnNames($modelClass = null)
{
    if (!$modelClass) {
        return null;
    }
    /* @var $modelClass \yii\db\ActiveRecord */
    $schema = $modelClass::getTableSchema();
    return array_keys($schema->columns);
}

            
getColumnType() public method

將抽象欄位類型轉換為實體欄位類型。

轉換是使用 $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 類型,將轉換為 "char(1)"
  • string:string 類型,將轉換為 "varchar(255)"
  • text:長字串類型,將轉換為 "text"
  • smallint:小整數類型,將轉換為 "smallint(6)"
  • integer:整數類型,將轉換為 "int(11)"
  • bigint:大整數類型,將轉換為 "bigint(20)"
  • boolean:布林類型,將轉換為 "tinyint(1)"
  • float:浮點數類型,將轉換為 "float"
  • decimal:十進位數字類型,將轉換為 "decimal"
  • datetime:datetime 類型,將轉換為 "datetime"
  • timestamp:timestamp 類型,將轉換為 "timestamp"
  • time:time 類型,將轉換為 "time"
  • date:date 類型,將轉換為 "date"
  • money:money 類型,將轉換為 "decimal(19,4)"
  • binary:二進位資料類型,將轉換為 "blob"

如果抽象類型包含兩個或多個以空格分隔的部分(例如 "string NOT NULL"),則只會轉換第一部分,其餘部分將附加到轉換結果。 例如,'string NOT NULL' 會轉換為 'varchar(255) NOT NULL'。

對於某些抽象類型,您也可以透過在類型後面的圓括號中直接附加長度或精確度約束來指定。 例如,在 MySQL 資料庫上,string(32) 將轉換為 "varchar(32)"。 如果底層 DBMS 不支援此類型的約束,則會被忽略。

如果在 $typeMap 中找不到類型,則會傳回而不進行任何變更。

public string getColumnType ( $type )
$type string|yii\db\ColumnSchemaBuilder

抽象欄位類型

return 字串

實體欄位類型。

                public function getColumnType($type)
{
    $columnType = parent::getColumnType($type);
    // remove unsupported keywords
    $columnType = preg_replace("/\s*comment '.*'/i", '', $columnType);
    $columnType = preg_replace('/ first$/i', '', $columnType);
    return $columnType;
}

            
getExpressionBuilder() public method (available since version 2.0.14)

Defined in: yii\db\QueryBuilder::getExpressionBuilder()

取得適用於 $expression 的 yii\db\ExpressionBuilderInterface 物件。

使用 $expressionBuilders 陣列來尋找合適的 builder 類別。

另請參閱 $expressionBuilders

public yii\db\ExpressionBuilderInterface getExpressionBuilder ( yii\db\ExpressionInterface $expression )
$expression yii\db\ExpressionInterface
throws 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];
}

            
hasLimit() protected method

Defined in: yii\db\QueryBuilder::hasLimit()

檢查給定的 limit 是否有效。

protected boolean hasLimit ( $limit )
$limit mixed

給定的限制

return boolean

限制是否有效

                protected function hasLimit($limit)
{
    return ($limit instanceof ExpressionInterface) || ctype_digit((string)$limit);
}

            
hasMethod() public method

Defined in: yii\base\BaseObject::hasMethod()

傳回一個值,指示是否已定義方法。

預設實作是呼叫 php 函數 method_exists()。 當您實作 php 魔術方法 __call() 時,您可以覆寫此方法。

public boolean hasMethod ( $name )
$name 字串

方法名稱

return boolean

方法是否已定義

                public function hasMethod($name)
{
    return method_exists($this, $name);
}

            
hasOffset() protected method

Defined in: yii\db\QueryBuilder::hasOffset()

檢查給定的 offset 是否有效。

protected boolean hasOffset ( $offset )
$offset mixed

給定的偏移量

return boolean

偏移量是否有效

                protected function hasOffset($offset)
{
    return ($offset instanceof ExpressionInterface) || ctype_digit((string)$offset) && (string)$offset !== '0';
}

            
hasProperty() public method

Defined in: yii\base\BaseObject::hasProperty()

傳回一個值,指示是否已定義屬性。

如果符合以下條件,則定義了屬性

  • 類別具有與指定名稱相關聯的 getter 或 setter 方法(在這種情況下,屬性名稱不區分大小寫);
  • 類別具有具有指定名稱的成員變數(當 $checkVars 為 true 時);

另請參閱

public boolean hasProperty ( $name, $checkVars true )
$name 字串

屬性名稱

$checkVars boolean

是否將成員變數視為屬性

return boolean

屬性是否已定義

                public function hasProperty($name, $checkVars = true)
{
    return $this->canGetProperty($name, $checkVars) || $this->canSetProperty($name, false);
}

            
init() public method

Defined in: yii\db\QueryBuilder::init()

初始化物件。

在以給定配置初始化物件後,此方法會在建構函式結尾被調用。

public void init ( )

                public function init()
{
    parent::init();
    $this->expressionBuilders = array_merge($this->defaultExpressionBuilders(), $this->expressionBuilders);
    $this->conditionClasses = array_merge($this->defaultConditionClasses(), $this->conditionClasses);
}

            
insert() public method

{@inheritdoc} 為取得插入的資料新增 OUTPUT 結構 (適用於 SQL Server 2005 或更高版本) OUTPUT 子句 - OUTPUT 子句是 SQL Server 2005 的新功能,並且能夠存取 INSERTED 和 DELETED 表格,就像觸發程序一樣。

public void insert ( $table, $columns, &$params )
$table
$columns
$params

                public function insert($table, $columns, &$params)
{
    $columns = $this->normalizeTableRowData($table, $columns, $params);
    $version2005orLater = version_compare($this->db->getSchema()->getServerVersion(), '9', '>=');
    list($names, $placeholders, $values, $params) = $this->prepareInsertValues($table, $columns, $params);
    $cols = [];
    $outputColumns = [];
    if ($version2005orLater) {
        /* @var $schema TableSchema */
        $schema = $this->db->getTableSchema($table);
        foreach ($schema->columns as $column) {
            if ($column->isComputed) {
                continue;
            }
            $dbType = $column->dbType;
            if (in_array($dbType, ['char', 'varchar', 'nchar', 'nvarchar', 'binary', 'varbinary'])) {
                $dbType .= '(MAX)';
            }
            if ($column->dbType === Schema::TYPE_TIMESTAMP) {
                $dbType = $column->allowNull ? 'varbinary(8)' : 'binary(8)';
            }
            $quoteColumnName = $this->db->quoteColumnName($column->name);
            $cols[] = $quoteColumnName . ' ' . $dbType . ' ' . ($column->allowNull ? 'NULL' : '');
            $outputColumns[] = 'INSERTED.' . $quoteColumnName;
        }
    }
    $countColumns = count($outputColumns);
    $sql = 'INSERT INTO ' . $this->db->quoteTableName($table)
        . (!empty($names) ? ' (' . implode(', ', $names) . ')' : '')
        . (($version2005orLater && $countColumns) ? ' OUTPUT ' . implode(',', $outputColumns) . ' INTO @temporary_inserted' : '')
        . (!empty($placeholders) ? ' VALUES (' . implode(', ', $placeholders) . ')' : $values);
    if ($version2005orLater && $countColumns) {
        $sql = 'SET NOCOUNT ON;DECLARE @temporary_inserted TABLE (' . implode(', ', $cols) . ');' . $sql .
            ';SELECT * FROM @temporary_inserted';
    }
    return $sql;
}

            
isOldMssql() protected method
自版本 2.0.14 起已棄用:使用 yii\db\mssql\Schema::getServerVersion()\version_compare()

protected boolean isOldMssql ( )
return boolean

正在使用的 MSSQL 版本是否早於 2012 年。

throws yii\base\InvalidConfigException
throws yii\db\Exception

                protected function isOldMssql()
{
    return version_compare($this->db->getSchema()->getServerVersion(), '11', '<');
}

            
newBuildOrderByAndLimit() protected method

為 SQL SERVER 2012 或更新版本建立 ORDER BY/LIMIT/OFFSET 子句。

protected string newBuildOrderByAndLimit ( $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()。

return 字串

完成 ORDER BY/LIMIT/OFFSET 的 SQL(如果有的話)

                protected function newBuildOrderByAndLimit($sql, $orderBy, $limit, $offset)
{
    $orderBy = $this->buildOrderBy($orderBy);
    if ($orderBy === '') {
        // ORDER BY clause is required when FETCH and OFFSET are in the SQL
        $orderBy = 'ORDER BY (SELECT NULL)';
    }
    $sql .= $this->separator . $orderBy;
    // http://technet.microsoft.com/en-us/library/gg699618.aspx
    $offset = $this->hasOffset($offset) ? $offset : '0';
    $sql .= $this->separator . "OFFSET $offset ROWS";
    if ($this->hasLimit($limit)) {
        $sql .= $this->separator . "FETCH NEXT $limit ROWS ONLY";
    }
    return $sql;
}

            
oldBuildOrderByAndLimit() protected method

為 SQL SERVER 2005 至 2008 版本建立 ORDER BY/LIMIT/OFFSET 子句。

protected string oldBuildOrderByAndLimit ( $sql, $orderBy, $limit, $offset )
$sql 字串

現有的 SQL(不含 ORDER BY/LIMIT/OFFSET)

$orderBy 陣列

排序依據的欄位。 有關如何指定此參數的更多詳細資訊,請參閱 yii\db\Query::orderBy()。

$limit integer|yii\db\Expression

限制數量。 有關更多詳細資訊,請參閱 yii\db\Query::limit()。

$offset integer

偏移數量。 有關更多詳細資訊,請參閱 yii\db\Query::offset()。

return 字串

完成 ORDER BY/LIMIT/OFFSET 的 SQL(如果有的話)

                protected function oldBuildOrderByAndLimit($sql, $orderBy, $limit, $offset)
{
    $orderBy = $this->buildOrderBy($orderBy);
    if ($orderBy === '') {
        // ROW_NUMBER() requires an ORDER BY clause
        $orderBy = 'ORDER BY (SELECT NULL)';
    }
    $sql = preg_replace('/^([\s(])*SELECT(\s+DISTINCT)?(?!\s*TOP\s*\()/i', "\\1SELECT\\2 rowNum = ROW_NUMBER() over ($orderBy),", $sql);
    if ($this->hasLimit($limit)) {
        if ($limit instanceof Expression) {
            $limit = '(' . (string)$limit . ')';
        }
        $sql = "SELECT TOP $limit * FROM ($sql) sub";
    } else {
        $sql = "SELECT * FROM ($sql) sub";
    }
    if ($this->hasOffset($offset)) {
        $sql .= $this->separator . "WHERE rowNum > $offset";
    }
    return $sql;
}

            
prepareInsertSelectSubQuery() protected method (available since version 2.0.11)

Defined in: 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 陳述式的參數。 這些參數將與查詢建置過程中產生的其他參數一起包含在結果中。

return 陣列

欄位名稱、值和參數的陣列。

throws 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];
}

            
prepareInsertValues() protected method (available since version 2.0.14)

Defined in: yii\db\QueryBuilder::prepareInsertValues()

INSERT SQL 陳述式準備 VALUES 部分。

protected array prepareInsertValues ( $table, $columns, $params = [] )
$table 字串

將在其中插入新列的表格。

$columns array|yii\db\Query

要插入資料表的欄位資料(name => value)或 Query 的實例,以執行 INSERT INTO ... SELECT SQL 陳述式。

$params 陣列

將由此方法產生的繫結參數。 它們應稍後繫結到 DB 命令。

return 陣列

欄位名稱、佔位符、值和參數的陣列。

                protected function prepareInsertValues($table, $columns, $params = [])
{
    $schema = $this->db->getSchema();
    $tableSchema = $schema->getTableSchema($table);
    $columnSchemas = $tableSchema !== null ? $tableSchema->columns : [];
    $names = [];
    $placeholders = [];
    $values = ' DEFAULT VALUES';
    if ($columns instanceof Query) {
        list($names, $values, $params) = $this->prepareInsertSelectSubQuery($columns, $schema, $params);
    } else {
        foreach ($columns as $name => $value) {
            $names[] = $schema->quoteColumnName($name);
            $value = isset($columnSchemas[$name]) ? $columnSchemas[$name]->dbTypecast($value) : $value;
            if ($value instanceof ExpressionInterface) {
                $placeholders[] = $this->buildExpression($value, $params);
            } elseif ($value instanceof \yii\db\Query) {
                list($sql, $params) = $this->build($value, $params);
                $placeholders[] = "($sql)";
            } else {
                $placeholders[] = $this->bindParam($value, $params);
            }
        }
    }
    return [$names, $placeholders, $values, $params];
}

            
prepareUpdateSets() protected method (available since version 2.0.14)

Defined in: yii\db\QueryBuilder::prepareUpdateSets()

UPDATE SQL 陳述式準備 SET 部分。

protected array prepareUpdateSets ( $table, $columns, $params = [] )
$table 字串

要更新的資料表。

$columns 陣列

要更新的欄位資料 (name => value)。

$params 陣列

繫結參數,此方法將修改這些參數,以便稍後將它們繫結到 DB 命令。

return 陣列

UPDATE SQL 陳述式的 SET 部分的陣列(第一個陣列元素)和參數(第二個陣列元素)。

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

            
prepareUpsertColumns() protected method (available since version 2.0.14)
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)];
}

            
renameColumn() public method

建立用於重新命名欄位的 SQL 陳述式。

public string renameColumn ( $table, $oldName, $newName )
$table 字串

要重新命名的欄位所屬的資料表。 名稱將由方法正確地引用。

$oldName 字串

欄位的舊名稱。 名稱將由方法正確地引用。

$newName 字串

欄位的新名稱。 名稱將由方法正確地引用。

return 字串

用於重新命名資料庫欄位的 SQL 陳述式。

                public function renameColumn($table, $oldName, $newName)
{
    $table = $this->db->quoteTableName($table);
    $oldName = $this->db->quoteColumnName($oldName);
    $newName = $this->db->quoteColumnName($newName);
    return "sp_rename '{$table}.{$oldName}', {$newName}, 'COLUMN'";
}

            
renameTable() public method

建立用於重新命名資料庫表格的 SQL 陳述式。

public string renameTable ( $oldName, $newName )
$oldName 字串

要重新命名的資料表。 名稱將由方法正確地引用。

$newName 字串

新的資料表名稱。 名稱將由方法正確地引用。

return 字串

用於重新命名資料庫資料表的 SQL 陳述式。

                public function renameTable($oldName, $newName)
{
    return 'sp_rename ' . $this->db->quoteTableName($oldName) . ', ' . $this->db->quoteTableName($newName);
}

            
resetSequence() public method

建立用於重設表格主鍵序列值的 SQL 陳述式。

序列將被重設,以便下一個插入的新資料列的主鍵將具有指定的值或 1。

public string resetSequence ( $tableName, $value null )
$tableName 字串

要重設主鍵序列的資料表名稱

$value mixed

下一個插入的新資料列的主鍵值。 如果未設定,則下一個新資料列的主鍵值將為 1。

return 字串

用於重設序列的 SQL 陳述式

throws yii\base\InvalidArgumentException

如果資料表不存在或沒有與資料表關聯的序列。

                public function resetSequence($tableName, $value = null)
{
    $table = $this->db->getTableSchema($tableName);
    if ($table !== null && $table->sequenceName !== null) {
        $tableName = $this->db->quoteTableName($tableName);
        if ($value === null) {
            $key = $this->db->quoteColumnName(reset($table->primaryKey));
            $value = "(SELECT COALESCE(MAX({$key}),0) FROM {$tableName})+1";
        } else {
            $value = (int) $value;
        }
        return "DBCC CHECKIDENT ('{$tableName}', RESEED, {$value})";
    } elseif ($table === null) {
        throw new InvalidArgumentException("Table not found: $tableName");
    }
    throw new InvalidArgumentException("There is not sequence associated with table '$tableName'.");
}

            
selectExists() public method (available since version 2.0.8)

建立 SELECT EXISTS() SQL 陳述式。

public string selectExists ( $rawSql )
$rawSql 字串

要從中選取的原始形式的子查詢。

return 字串

SELECT EXISTS() SQL 陳述式。

                public function selectExists($rawSql)
{
    return 'SELECT CASE WHEN EXISTS(' . $rawSql . ') THEN 1 ELSE 0 END';
}

            
setConditionClasses() public method (available since version 2.0.14.2)
public void setConditionClasses ( $classes )
$classes 字串[]

條件別名到條件類別的映射。 例如

['LIKE' => yii\db\condition\LikeCondition::class]

                public function setConditionClasses($classes)
{
    $this->conditionClasses = array_merge($this->conditionClasses, $classes);
}

            
setExpressionBuilders() public method (available since version 2.0.14)
public void setExpressionBuilders ( $builders )
$builders 字串[]

應與 $expressionBuilders 屬性中預定義的建構器合併的建構器陣列。

                public function setExpressionBuilders($builders)
{
    $this->expressionBuilders = array_merge($this->expressionBuilders, $builders);
}

            
truncateTable() public method

Defined in: yii\db\QueryBuilder::truncateTable()

建立用於截斷資料庫表格的 SQL 陳述式。

public string truncateTable ( $table )
$table 字串

要截斷的資料表。 名稱將由方法正確地引用。

return 字串

用於截斷資料庫資料表的 SQL 陳述式。

                public function truncateTable($table)
{
    return 'TRUNCATE TABLE ' . $this->db->quoteTableName($table);
}

            
update() public method

建立 UPDATE SQL 陳述式。

例如,

$params = [];
$sql = $queryBuilder->update('user', ['status' => 1], 'age > 30', $params);

此方法將正確地跳脫資料表和資料行名稱。

public string update ( $table, $columns, $condition, &$params )
$table 字串

要更新的資料表。

$columns 陣列

要更新的欄位資料 (name => value)。

$condition array|string

將放在 WHERE 部分的條件。請參閱 yii\db\Query::where(),以了解如何指定條件。

$params 陣列

繫結參數,此方法將修改這些參數,以便稍後將它們繫結到 DB 命令。

return 字串

UPDATE SQL 語法

                public function update($table, $columns, $condition, &$params)
{
    return parent::update($table, $this->normalizeTableRowData($table, $columns, $params), $condition, $params);
}

            
upsert() public method (available since version 2.0.14)

建立 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);

此方法將正確地跳脫資料表和資料行名稱。

另請參閱

public string upsert ( $table, $insertColumns, $updateColumns, &$params )
$table 字串

新資料列將被插入/更新至的表格。

$insertColumns array|yii\db\Query

要插入表格的欄位資料 (name => value) 或是 yii\db\Query 的實例,以執行 INSERT INTO ... SELECT SQL 陳述式。

$updateColumns array|boolean

如果欄位資料已存在,則要更新的欄位資料 (name => value)。如果傳遞 true,欄位資料將更新為與插入的欄位資料相符。如果傳遞 false,如果欄位資料已存在,則不會執行任何更新。

$params 陣列

將由此方法產生的繫結參數。 它們應稍後繫結到 DB 命令。

return 字串

產生的 SQL 語法。

throws yii\base\NotSupportedException

如果底層 DBMS 不支援此功能。

                public function upsert($table, $insertColumns, $updateColumns, &$params)
{
    $insertColumns = $this->normalizeTableRowData($table, $insertColumns, $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);
    /**
     * Fix number of select query params for old MSSQL version that does not support offset correctly.
     * @see QueryBuilder::oldBuildOrderByAndLimit
     */
    $insertNamesUsing = $insertNames;
    if (strstr($values, 'rowNum = ROW_NUMBER()') !== false) {
        $insertNamesUsing = array_merge(['[rowNum]'], $insertNames);
    }
    $mergeSql = 'MERGE ' . $this->db->quoteTableName($table) . ' WITH (HOLDLOCK) '
        . 'USING (' . (!empty($placeholders) ? 'VALUES (' . implode(', ', $placeholders) . ')' : ltrim($values, ' ')) . ') AS [EXCLUDED] (' . implode(', ', $insertNamesUsing) . ') '
        . "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);
        }
    }
    $updateColumns = $this->normalizeTableRowData($table, $updateColumns, $params);
    list($updates, $params) = $this->prepareUpdateSets($table, $updateColumns, $params);
    $updateSql = 'UPDATE SET ' . implode(', ', $updates);
    return "$mergeSql WHEN MATCHED THEN $updateSql WHEN NOT MATCHED THEN $insertSql;";
}