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 array クエリ条件からビルダーメソッドへのマップ。 yii\db\QueryBuilder
$conditionClasses array 条件エイリアスから条件クラスへのマップ。 yii\db\QueryBuilder
$db yii\db\Connection データベース接続。 yii\db\QueryBuilder
$expressionBuilders string[]|yii\db\ExpressionBuilderInterface[] 式クラスを式ビルダークラスにマップします。 yii\db\QueryBuilder
$separator string SQL ステートメントの異なるフラグメント間の区切り文字。 yii\db\QueryBuilder
$typeMap array 抽象的なカラム型(キー)から物理的なカラム型(値)へのマッピング。 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() 新しい DB カラムを追加するための 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() 2 つ以上の SQL 式を AND または OR 演算子で接続します。 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() yii\db\Query::where() で説明されているように、配列形式で定義された $condition を、$conditionClasses マップに従って yii\db\condition\ConditionInterface のインスタンスに変換します。 yii\db\QueryBuilder
createIndex() 新しいインデックスを作成するための SQL ステートメントを構築します。 yii\db\QueryBuilder
createTable() 新しい DB テーブルを作成するための 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() DB テーブルを削除するための 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() DB テーブルの名前を変更するための 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() DB テーブルを切り捨てるための 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)',
]

メソッドの詳細

継承されたメソッドを非表示にする

__call() public メソッド

定義元: yii\base\BaseObject::__call()

クラスメソッドではない名前付きメソッドを呼び出します。

このメソッドはPHPのマジックメソッドであり、未知のメソッドが呼び出されたときに暗黙的に呼び出されるため、直接呼び出さないでください。

public mixed __call ( $name, $params )
$name string

メソッド名

$params array

メソッドのパラメータ

戻り値 mixed

メソッドの戻り値

例外 yii\base\UnknownMethodException

未知のメソッドを呼び出した場合

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

            
__construct() public メソッド

定義元: yii\db\QueryBuilder::__construct()

コンストラクタ。

public void __construct ( $connection, $config = [] )
$connection yii\db\Connection

データベース接続。

$config array

オブジェクトのプロパティを初期化するために使用される名前と値のペア

                public function __construct($connection, $config = [])
{
    $this->db = $connection;
    parent::__construct($config);
}

            
__get() public メソッド

定義元: yii\base\BaseObject::__get()

オブジェクトプロパティの値を返します。

このメソッドはPHPのマジックメソッドであり、$value = $object->property; を実行するときに暗黙的に呼び出されるため、直接呼び出さないでください。

参照: __set().

public mixed __get ( $name )
$name string

プロパティ名

戻り値 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);
}

            
__isset() public メソッド

定義元: yii\base\BaseObject::__isset()

プロパティが設定されているか、つまり定義されており、null でないかを確認します。

isset($object->property) を実行すると暗黙的に呼び出される PHP のマジックメソッドであるため、このメソッドを直接呼び出さないでください。

プロパティが定義されていない場合は、false が返されることに注意してください。

こちらも参照してください https://www.php.net/manual/en/function.isset.php

public boolean __isset ( $name )
$name string

プロパティ名またはイベント名

戻り値 boolean

指定されたプロパティが設定されている(null でない)かどうか。

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

            
__set() public メソッド

定義元: yii\base\BaseObject::__set()

オブジェクトプロパティの値を設定します。

$object->property = $value; を実行すると暗黙的に呼び出される PHP のマジックメソッドであるため、このメソッドを直接呼び出さないでください。

こちらも参照してください __get()

public void __set ( $name, $value )
$name string

プロパティ名またはイベント名

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

            
__unset() public メソッド

定義元: yii\base\BaseObject::__unset()

オブジェクトプロパティを null に設定します。

unset($object->property) を実行すると暗黙的に呼び出される PHP のマジックメソッドであるため、このメソッドを直接呼び出さないでください。

プロパティが定義されていない場合、このメソッドは何も行いません。プロパティが読み取り専用の場合、例外がスローされます。

こちらも参照してください https://www.php.net/manual/en/function.unset.php

public void __unset ( $name )
$name string

プロパティ名

例外 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 メソッド (バージョン 2.0.13 から利用可能)

定義元: yii\db\QueryBuilder::addCheck()

既存のテーブルにチェック制約を追加するための SQL コマンドを作成します。

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

チェック制約の名前。名前はメソッドによって適切にクォートされます。

$table string

チェック制約が追加されるテーブル。名前はメソッドによって適切にクォートされます。

$expression string

CHECK 制約の SQL。

戻り値 string

既存のテーブルにチェック制約を追加するための 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 メソッド

定義元: yii\db\QueryBuilder::addColumn()

新しい DB カラムを追加するための SQL ステートメントを構築します。

public string addColumn ( $table, $column, $type )
$table string

新しい列が追加されるテーブル。テーブル名はメソッドによって適切にクォートされます。

$column string

新しい列の名前。名前はメソッドによって適切にクォートされます。

$type string

列の型。 getColumnType() メソッドが呼び出され、抽象的な列の型(もしあれば)を物理的な型に変換します。抽象的な型として認識されないものは、生成される SQL で保持されます。たとえば、'string' は 'varchar(255)' に変換されますが、'string not null' は 'varchar(255) not null' になります。

戻り値 string

新しい列を追加するための SQL ステートメント。

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

            
addCommentOnColumn() public メソッド (バージョン 2.0.8 から利用可能)

カラムにコメントを追加するための SQL コマンドを構築します。

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

コメントを追加する列を持つテーブル。テーブル名はメソッドによって適切にクォートされます。

$column string

コメントを追加する列の名前。列の名前はメソッドによって適切にクォートされます。

$comment string

追加するコメントのテキスト。コメントはメソッドによって適切にクォートされます。

戻り値 string

列にコメントを追加するための SQL ステートメント

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

            
addCommentOnTable() public メソッド (バージョン 2.0.8 から利用可能)

テーブルにコメントを追加するための SQL コマンドを構築します。

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

コメントを追加する列を持つテーブル。テーブル名はメソッドによって適切にクォートされます。

$comment string

追加するコメントのテキスト。コメントはメソッドによって適切にクォートされます。

戻り値 string

テーブルにコメントを追加するための SQL ステートメント

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

            
addDefaultValue() public メソッド (バージョン 2.0.13 から利用可能)

既存のテーブルにデフォルト値制約を追加するための SQL コマンドを作成します。

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

デフォルト値制約の名前。名前はメソッドによって適切にクォートされます。

$table string

デフォルト値制約が追加されるテーブル。名前はメソッドによって適切にクォートされます。

$column string

制約が追加される列の名前。名前はメソッドによって適切にクォートされます。

$value mixed

デフォルト値。

戻り値 string

既存のテーブルにデフォルト値制約を追加するための SQL ステートメント。

例外 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 メソッド

定義元: yii\db\QueryBuilder::addForeignKey()

既存のテーブルに外部キー制約を追加するための SQL ステートメントを構築します。

このメソッドは、テーブル名と列名を適切にクォートします。

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

外部キー制約の名前。

$table string

外部キー制約が追加されるテーブル。

$columns string|array

制約が追加される列の名前。複数の列がある場合は、カンマで区切るか、配列を使用して表します。

$refTable string

外部キーが参照するテーブル。

$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

戻り値 string

既存のテーブルに外部キー制約を追加するための 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 メソッド

定義元: yii\db\QueryBuilder::addPrimaryKey()

既存のテーブルに主キー制約を追加するための SQL ステートメントを構築します。

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

プライマリキー制約の名前。

$table string

プライマリキー制約が追加されるテーブル。

$columns string|array

プライマリキーを構成するカンマ区切りの文字列またはカラムの配列。

戻り値 string

既存のテーブルにプライマリキー制約を追加するための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() public メソッド (バージョン 2.0.13 以降)

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

既存のテーブルに一意制約を追加するための SQL コマンドを作成します。

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

ユニーク制約の名前。名前はメソッドによって適切にクォートされます。

$table string

ユニーク制約が追加されるテーブル。名前はメソッドによって適切にクォートされます。

$columns string|array

制約が追加されるカラムの名前。複数のカラムがある場合は、カンマで区切ります。名前はメソッドによって適切にクォートされます。

戻り値 string

既存のテーブルにユニーク制約を追加するための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() public メソッド

カラムの定義を変更するための SQL ステートメントを構築します。

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

カラムが変更されるテーブル。テーブル名はメソッドによって適切にクォートされます。

$column string

変更されるカラムの名前。名前はメソッドによって適切にクォートされます。

$type string

新しいカラムの型。getColumnType() メソッドが呼び出され、抽象カラム型 (存在する場合) を物理的なカラム型に変換します。抽象型として認識されないものは、生成されたSQLに保持されます。例えば、'string' は 'varchar(255)' に変換されますが、'string not null' は 'varchar(255) not null' になります。

戻り値 string

カラムの定義を変更するためのSQLステートメント。

例外 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() public メソッド

定義元: 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 string

新しい行が挿入されるテーブル。

$columns array

カラム名

$rows array|Generator

テーブルにバッチ挿入される行

$params array

バインディングパラメータ。このパラメータは 2.0.14 以降存在します。

戻り値 string

バッチ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() public メソッド (バージョン 2.0.14 以降)

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

PARAM_PREFIX を使用して、$value を $params 配列に追加するためのヘルパーメソッド。

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

参照渡し

戻り値 string

$params配列内のプレースホルダー名

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

            
build() public メソッド

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

yii\db\Query オブジェクトから SELECT SQL ステートメントを生成します。

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

SQLステートメントが生成されるyii\db\Query オブジェクト。

$params array

生成されたSQLステートメントにバインドされるパラメータ。これらのパラメータは、クエリの構築プロセス中に生成された追加のパラメータとともに結果に含まれます。

戻り値 array

生成されたSQLステートメント(配列の最初の要素)と、SQLステートメントにバインドされる対応するパラメータ(配列の2番目の要素)。返されるパラメータには、$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() protected メソッド (バージョン 2.0.24 以降)

テーブルまたはカラムにコメントを追加または更新するための SQL コマンドを構築します。構築されたコマンドは、コメントが既に存在するかどうかを確認します。存在する場合は更新され、それ以外の場合は追加されます。

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

追加するコメントのテキスト。コメントはメソッドによって適切にクォートされます。

$table string

コメントされるテーブル、またはコメントされるカラムを持つテーブル。テーブル名はメソッドによって適切にクォートされます。

$column string|null

オプション。コメントされるカラムの名前。空の場合、コマンドはテーブルにコメントを追加します。カラム名はメソッドによって適切にクォートされます。

戻り値 string

コメントを追加するためのSQLステートメント。

例外 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() public メソッド
2.0.14 以降非推奨。代わりに buildCondition() を使用してください。

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

2 つ以上の SQL 式を AND または OR 演算子で接続します。

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

指定されたオペランドを接続するために使用する演算子

$operands array

接続するSQL式。

$params array

設定されるバインディングパラメータ

戻り値 string

生成されたSQL式

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

            
buildBetweenCondition() public メソッド
2.0.14 以降非推奨。代わりに buildCondition() を使用してください。

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

BETWEEN 演算子を使用した SQL 式を作成します。

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

使用する演算子(例:BETWEEN または NOT BETWEEN

$operands array

最初のオペランドはカラム名です。2番目と3番目のオペランドは、カラム値が入るべき間隔を表します。

$params array

設定されるバインディングパラメータ

戻り値 string

生成されたSQL式

例外 yii\base\InvalidArgumentException

オペランドの数が間違っている場合。

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

            
buildColumns() public メソッド

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

カラムを処理し、必要に応じて適切に引用符で囲みます。

すべてのカラムをカンマ区切りの文字列に結合します。

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

処理対象のカラム

戻り値 string

処理結果

                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() public メソッド

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

条件仕様を解析し、対応する SQL 式を生成します。

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

条件の指定。条件の指定方法については yii\db\Query::where() を参照してください。

$params array

設定されるバインディングパラメータ

戻り値 string

生成された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() public メソッド
2.0.14 以降非推奨。代わりに buildCondition() を使用してください。

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

EXISTS 演算子を使用した SQL 式を作成します。

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

使用する演算子 (例: EXISTS または NOT EXISTS)

$operands array

サブクエリを表す yii\db\Query オブジェクトである一つの要素のみを含みます。

$params array

設定されるバインディングパラメータ

戻り値 string

生成されたSQL式

例外 yii\base\InvalidArgumentException

オペランドが yii\db\Query オブジェクトではない場合。

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

            
buildExpression() public メソッド (バージョン 2.0.14 から利用可能)
public string buildExpression ( yii\db\ExpressionInterface $expression, &$params = [] )
$expression yii\db\ExpressionInterface

構築される式

$params array

生成されたSQL文にバインドされるパラメータ。これらのパラメータは、式構築処理中に生成された追加のパラメータとともに結果に含まれます。

戻り値 string

DBMSに渡される前にクォートもエンコードもされないSQL文

例外 yii\base\InvalidArgumentException

$expression の構築がこの QueryBuilder でサポートされていない場合。

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

            
buildFrom() public メソッド
public string buildFrom ( $tables, &$params )
$tables array
$params array

設定されるバインディングパラメータ

戻り値 string

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 メソッド
public string buildGroupBy ( $columns )
$columns array
戻り値 string

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() public メソッド
2.0.14 以降非推奨。代わりに buildCondition() を使用してください。

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

カラムと値のペアに基づいて条件を作成します。

public string buildHashCondition ( $condition, &$params )
$condition array

条件の指定。

$params array

設定されるバインディングパラメータ

戻り値 string

生成されたSQL式

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

            
buildHaving() public メソッド
public string buildHaving ( $condition, &$params )
$condition string|array
$params array

設定されるバインディングパラメータ

戻り値 string

yii\db\Query::$having から構築された HAVING 句。

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

            
buildInCondition() public メソッド
2.0.14 以降非推奨。代わりに buildCondition() を使用してください。

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

IN 演算子を使用した SQL 式を作成します。

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

使用する演算子 (例: IN または NOT IN)

$operands array

最初のオペランドはカラム名です。配列の場合、複合 IN 条件が生成されます。2番目のオペランドは、カラムの値がその中に含まれるべき値の配列です。空の配列の場合、生成される式は、演算子が `IN` の場合は `false` 値になり、演算子が `NOT IN` の場合は空になります。

$params array

設定されるバインディングパラメータ

戻り値 string

生成されたSQL式

例外 yii\db\Exception

オペランドの数が間違っている場合。

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

            
buildJoin() public メソッド
public string buildJoin ( $joins, &$params )
$joins array
$params array

設定されるバインディングパラメータ

戻り値 string

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

            
buildLikeCondition() public メソッド
2.0.14 以降非推奨。代わりに buildCondition() を使用してください。

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

LIKE 演算子を使用した SQL 式を作成します。

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

使用する演算子 (例: LIKE, NOT LIKE, OR LIKE, または OR NOT LIKE)

$operands array

2つまたは3つのオペランドの配列

  • 最初のオペランドはカラム名です。
  • 2番目のオペランドは、カラムの値と比較される単一の値または値の配列です。空の配列の場合、生成される式は、演算子が LIKE または OR LIKE の場合は `false` 値になり、演算子が NOT LIKE または OR NOT LIKE の場合は空になります。
  • オプションの3番目のオペランドは、値の特殊文字をエスケープする方法を指定するために提供することもできます。オペランドは、特殊文字からエスケープされた対応物へのマッピングの配列である必要があります。このオペランドが提供されない場合、デフォルトのエスケープマッピングが使用されます。値がすでにエスケープされており、エスケープを適用する必要がないことを示すには、`false` または空の配列を使用できます。エスケープマッピングを使用する場合 (または3番目のオペランドが提供されない場合)、値は自動的にパーセント文字のペアで囲まれることに注意してください。
$params array

設定されるバインディングパラメータ

戻り値 string

生成されたSQL式

例外 yii\base\InvalidArgumentException

オペランドの数が間違っている場合。

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

            
buildLimit() public メソッド
public string buildLimit ( $limit, $offset )
$limit 整数型
$offset 整数型
戻り値 string

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() public メソッド
2.0.14 以降非推奨。代わりに buildCondition() を使用してください。

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

NOT 演算子で SQL 式を反転させます。

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

指定されたオペランドを接続するために使用する演算子

$operands array

接続するSQL式。

$params array

設定されるバインディングパラメータ

戻り値 string

生成されたSQL式

例外 yii\base\InvalidArgumentException

オペランドの数が間違っている場合。

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

            
buildOrderBy() public メソッド
public string buildOrderBy ( $columns )
$columns array
戻り値 string

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() public メソッド

ORDER BY および LIMIT/OFFSET 句を構築し、指定された SQL に追加します。

public string buildOrderByAndLimit ( $sql, $orderBy, $limit, $offset )
$sql string

既存のSQL(ORDER BY / LIMIT / OFFSET を含まない)

$orderBy array

order by カラム。このパラメーターの指定方法の詳細については、yii\db\Query::orderBy() を参照してください。

$limit 整数型

limit 数。詳細については、yii\db\Query::limit() を参照してください。

$offset 整数型

offset 数。詳細については、yii\db\Query::offset() を参照してください。

戻り値 string

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() protected メソッド (バージョン 2.0.24 以降で利用可能)

テーブルまたはカラムからコメントを削除するための SQL コマンドを構築します。構築されたコマンドは、削除を実行する前にコメントが既に存在するかどうかを確認します。

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

コメントを削除するテーブル、またはコメントを削除するカラムを持つテーブル。テーブル名はメソッドによって適切にクォートされます。

$column string|null

オプション。コメントを削除するカラムの名前。空の場合、コマンドは代わりにテーブルからコメントを削除します。カラム名はメソッドによって適切にクォートされます。

戻り値 string

コメントを削除するためのSQLステートメント。

例外 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 メソッド
public string buildSelect ( $columns, &$params, $distinct false, $selectOption null )
$columns array
$params array

設定されるバインディングパラメータ

$distinct boolean
$selectOption string|null
戻り値 string

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 メソッド
2.0.14 以降非推奨。代わりに buildCondition() を使用してください。

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

"column" operator value のような SQL 式を作成します。

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

使用する演算子。><=など、何でも使用できます。

$operands array

2つのカラム名を含みます。

$params array

設定されるバインディングパラメータ

戻り値 string

生成されたSQL式

例外 yii\base\InvalidArgumentException

オペランドの数が間違っている場合。

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

            
buildUnion() public メソッド
public string buildUnion ( $unions, &$params )
$unions array
$params array

設定されるバインディングパラメータ

戻り値 string

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 メソッド
public string buildWhere ( $condition, &$params )
$condition string|array
$params array

設定されるバインディングパラメータ

戻り値 string

yii\db\Query::$where から構築された WHERE 句。

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

            
buildWithQueries() public メソッド (バージョン 2.0.35 以降で利用可能)

定義元: yii\db\QueryBuilder::buildWithQueries()

yii\db\Query::withQuery() も参照してください。

public string buildWithQueries ( $withs, &$params )
$withs array

各WITHクエリの設定

$params array

設定されるバインディングパラメータ

戻り値 string

ネストされたクエリを含む、コンパイルされたクエリの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 メソッド

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

プロパティが読み取り可能かどうかを示す値を返します。

プロパティが読み取り可能であるのは、以下のいずれかの場合です。

  • クラスが、指定された名前に関連付けられたゲッターメソッドを持っている場合(この場合、プロパティ名は大小文字を区別しません)。
  • クラスが、指定された名前のメンバ変数を持っている場合($checkVars が true の場合)。

canSetProperty() も参照してください。

public boolean canGetProperty ( $name, $checkVars true )
$name string

プロパティ名

$checkVars boolean

メンバ変数をプロパティとして扱うかどうか

戻り値 boolean

プロパティが読み取り可能かどうか

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

            
canSetProperty() public メソッド

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

プロパティが設定可能かどうかを示す値を返します。

プロパティが書き込み可能であるのは、以下の場合です。

  • クラスが、指定された名前に関連付けられたセッターメソッドを持っている場合(この場合、プロパティ名は大小文字を区別しません)。
  • クラスが、指定された名前のメンバ変数を持っている場合($checkVars が true の場合)。

canGetProperty() も参照してください。

public boolean canSetProperty ( $name, $checkVars true )
$name string

プロパティ名

$checkVars boolean

メンバ変数をプロパティとして扱うかどうか

戻り値 boolean

プロパティが書き込み可能かどうか

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

            
checkIntegrity() public メソッド

整合性チェックを有効または無効にするための SQL ステートメントを構築します。

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

整合性チェックをオンにするかオフにするか。

$schema string

テーブルのスキーマ。

$table string

テーブル名。

戻り値 string

整合性チェックのための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 メソッド
2.0.14から非推奨。PHP >= 5.5では、代わりに::classを使用してください。

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

このクラスの完全修飾名を返します。

public static string className ( )
戻り値 string

このクラスの完全修飾名。

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

            
createConditionFromArray() public メソッド (バージョン2.0.14から利用可能)

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

yii\db\Query::where() で説明されているように、配列形式で定義された $condition を、$conditionClasses マップに従って 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 メソッド

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

新しいインデックスを作成するための SQL ステートメントを構築します。

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

インデックスの名前。名前はメソッドによって適切にクォートされます。

$table string

新しいインデックスが作成されるテーブル。テーブル名はメソッドによって適切にクォートされます。

$columns string|array

インデックスに含める必要がある列。複数の列がある場合は、コンマで区切るか、配列を使用して表現します。名前の中に括弧が見つからない限り、各列名はメソッドによって適切にクォートされます。

$unique boolean

作成されたインデックスにUNIQUE制約を追加するかどうか。

戻り値 string

新しいインデックスを作成するための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 メソッド

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

新しい DB テーブルを作成するための 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 string

作成するテーブルの名前。名前はメソッドによって適切にクォートされます。

$columns array

新しいテーブルの列(名前 => 定義)。

$options string|null

生成されたSQLに追加される追加のSQLフラグメント。

戻り値 string

新しい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 メソッド (バージョン2.0.14から利用可能)

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

SQL ビューを作成します。

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

作成するビューの名前。

$subQuery string|yii\db\Query

ビューを定義するSELECTステートメント。これは、文字列またはyii\db\Queryオブジェクトのいずれかになります。

戻り値 string

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 メソッド (バージョン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 メソッド (バージョン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 メソッド

定義元: yii\db\QueryBuilder::delete()

DELETE SQL ステートメントを作成します。

例えば、

$sql = $queryBuilder->delete('user', 'status = 0');

メソッドは、テーブル名と列名を適切にエスケープします。

public string delete ( $table, $condition, &$params )
$table string

データが削除されるテーブル。

$condition array|string

WHERE部分に配置される条件。yii\db\Query::where()で条件を指定する方法を参照してください。

$params array

後でDBコマンドにバインドできるように、このメソッドによって変更されるバインドパラメータ。

戻り値 string

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 メソッド (バージョン2.0.13から利用可能)

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

チェック制約を削除するための SQL コマンドを作成します。

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

削除するチェック制約の名前。名前はメソッドによって適切にクォートされます。

$table string

チェック制約を削除するテーブル。名前はメソッドによって適切にクォートされます。

戻り値 string

チェック制約を削除するためのSQL文。

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

            
dropColumn() public メソッド

カラム削除前にすべての制約を削除します。{@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 メソッド (バージョン 2.0.8 から利用可能)

カラムにコメントを追加するための SQL コマンドを構築します。

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

コメントを追加する列を持つテーブル。テーブル名はメソッドによって適切にクォートされます。

$column string

コメントを追加する列の名前。列の名前はメソッドによって適切にクォートされます。

戻り値 string

列にコメントを追加するための SQL ステートメント

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

            
dropCommentFromTable() public メソッド (バージョン 2.0.8 から利用可能)

テーブルにコメントを追加するための SQL コマンドを構築します。

public string dropCommentFromTable ( $table )
$table string

コメントを追加する列を持つテーブル。テーブル名はメソッドによって適切にクォートされます。

戻り値 string

列にコメントを追加するための SQL ステートメント

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

            
dropDefaultValue() public メソッド (バージョン 2.0.13 から利用可能)

デフォルト値制約を削除するための SQL コマンドを作成します。

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

削除するデフォルト値制約の名前。名前はメソッドによって適切にクォートされます。

$table string

デフォルト値制約を削除するテーブル。名前はメソッドによって適切にクォートされます。

戻り値 string

デフォルト値制約を削除するためのSQL文。

例外 yii\base\NotSupportedException

基盤となる DBMS でサポートされていない場合。

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

            
dropForeignKey() public メソッド

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

外部キー制約を削除するための SQL ステートメントを構築します。

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

削除する外部キー制約の名前。名前はメソッドによって適切にクォートされます。

$table string

外部キーを削除するテーブル。名前はメソッドによって適切にクォートされます。

戻り値 string

外部キー制約を削除するためのSQL文。

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

            
dropIndex() public メソッド

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

インデックスを削除するための SQL ステートメントを構築します。

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

削除するインデックスの名前。名前はメソッドによって適切にクォートされます。

$table string

インデックスを削除するテーブル。名前はメソッドによって適切にクォートされます。

戻り値 string

インデックスを削除するためのSQL文。

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

            
dropPrimaryKey() public メソッド

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

既存のテーブルから主キー制約を削除するための SQL ステートメントを構築します。

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

削除する主キー制約の名前。

$table string

主キー制約を削除するテーブル。

戻り値 string

既存のテーブルから主キー制約を削除するためのSQL文。

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

            
dropTable() public メソッド

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

DB テーブルを削除するための SQL ステートメントを構築します。

public string dropTable ( $table )
$table string

削除するテーブル。名前はメソッドによって適切にクォートされます。

戻り値 string

DBテーブルを削除するためのSQL文。

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

            
dropUnique() public メソッド (バージョン 2.0.13 から利用可能)

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

一意制約を削除するための SQL コマンドを作成します。

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

削除するユニーク制約の名前。名前はメソッドによって適切にクォートされます。

$table string

ユニーク制約を削除するテーブル。名前はメソッドによって適切にクォートされます。

戻り値 string

ユニーク制約を削除するためのSQL文。

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

            
dropView() public メソッド (バージョン 2.0.14 から利用可能)

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

SQL ビューを削除します。

public string dropView ( $viewName )
$viewName string

削除するビューの名前。

戻り値 string

DROP VIEW SQL文。

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

            
executeResetSequence() public メソッド (バージョン 2.0.16 から利用可能)

定義元: yii\db\QueryBuilder::executeResetSequence()

テーブルの主キーのシーケンス値をリセットするための SQL ステートメントを実行します。

executeを使う理由は、一部のデータベース (Oracle) ではそれを実行するために複数のクエリが必要なためです。シーケンスは、挿入される次の新しい行の主キーが指定された値または既存の最大値 + 1 を持つようにリセットされます。

public void executeResetSequence ( $table, $value null )
$table string

主キーシーケンスをリセットするテーブルの名前

$value array|string|null

挿入される次の新しい行の主キーの値。これが設定されていない場合、次の新しい行の主キーは既存の最大値 + 1 を持ちます。

例外 yii\base\NotSupportedException

基礎となるDBMSでサポートされていない場合

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

            
extractAlias() protected メソッド (バージョン 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 メソッド

指定されたモデル名からカラム名の配列を返します。

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

モデルクラスの名前

戻り値 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 メソッド

抽象的なカラム型を物理的なカラム型に変換します。

変換は、$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: 長い string タイプ。 "text" に変換されます。
  • smallint: small integer タイプ。 "smallint(6)" に変換されます。
  • integer: integer タイプ。 "int(11)" に変換されます。
  • bigint: big integer タイプ。 "bigint(20)" に変換されます。
  • boolean: boolean タイプ。 "tinyint(1)" に変換されます。
  • float: float 数値タイプ。 "float" に変換されます。
  • decimal: decimal 数値タイプ。 "decimal" に変換されます。
  • datetime: datetime タイプ。 "datetime" に変換されます。
  • timestamp: timestamp タイプ。 "timestamp" に変換されます。
  • time: time タイプ。 "time" に変換されます。
  • date: date タイプ。 "date" に変換されます。
  • money: money タイプ。 "decimal(19,4)" に変換されます。
  • binary: binary データタイプ。 "blob" に変換されます。

抽象タイプがスペースで区切られた2つ以上の部分を含む場合(例えば "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

抽象カラムタイプ

戻り値 string

物理カラムタイプ。

                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 メソッド (バージョン 2.0.14 から利用可能)

定義元: yii\db\QueryBuilder::getExpressionBuilder()

$expression に適した yii\db\ExpressionBuilderInterface のオブジェクトを取得します。

$expressionBuilders 配列を使用して、適切なビルダークラスを見つけます。

$expressionBuilders も参照してください。

public yii\db\ExpressionBuilderInterface getExpressionBuilder ( yii\db\ExpressionInterface $expression )
$expression yii\db\ExpressionInterface
例外 yii\base\InvalidArgumentException

$expression の構築がこの QueryBuilder でサポートされていない場合。

                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 メソッド

定義元: yii\db\QueryBuilder::hasLimit()

指定された limit が有効かどうかを確認します。

protected boolean hasLimit ( $limit )
$limit mixed

指定された制限

戻り値 boolean

制限が有効かどうか

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

            
hasMethod() public メソッド

定義元: yii\base\BaseObject::hasMethod()

メソッドが定義されているかどうかを示す値を返します。

デフォルトの実装は、php 関数の method_exists() の呼び出しです。php のマジックメソッド __call() を実装した場合は、このメソッドをオーバーライドできます。

public boolean hasMethod ( $name )
$name string

メソッド名

戻り値 boolean

メソッドが定義されているかどうか

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

            
hasOffset() protected メソッド

定義元: yii\db\QueryBuilder::hasOffset()

指定された offset が有効かどうかを確認します。

protected boolean hasOffset ( $offset )
$offset mixed

指定されたオフセット

戻り値 boolean

オフセットが有効かどうか

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

            
hasProperty() public メソッド

定義元: yii\base\BaseObject::hasProperty()

プロパティが定義されているかどうかを示す値を返します。

プロパティは以下の場合に定義されます。

  • クラスが、指定された名前に関連付けられた getter または setter メソッドを持っている場合(この場合、プロパティ名は大文字と小文字を区別しません)。
  • クラスが、指定された名前のメンバ変数を持っている場合($checkVars が true の場合)。

参照

public boolean hasProperty ( $name, $checkVars true )
$name string

プロパティ名

$checkVars boolean

メンバ変数をプロパティとして扱うかどうか

戻り値 boolean

プロパティが定義されているかどうか

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

            
init() public メソッド

定義元: 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 メソッド

{@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 メソッド
バージョン 2.0.14 から非推奨: yii\db\mssql\Schema::getServerVersion()\version_compare() と共に使用してください。

protected boolean isOldMssql ( )
戻り値 boolean

使用されている MSSQL のバージョンが 2012 より古いかどうか。

例外 yii\base\InvalidConfigException
例外 yii\db\Exception

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

            
newBuildOrderByAndLimit() protected メソッド

SQL SERVER 2012 以降の ORDER BY/LIMIT/OFFSET 句を構築します。

protected string newBuildOrderByAndLimit ( $sql, $orderBy, $limit, $offset )
$sql string

既存のSQL(ORDER BY / LIMIT / OFFSET を含まない)

$orderBy array

order by カラム。このパラメーターの指定方法の詳細については、yii\db\Query::orderBy() を参照してください。

$limit 整数型

limit 数。詳細については、yii\db\Query::limit() を参照してください。

$offset 整数型

offset 数。詳細については、yii\db\Query::offset() を参照してください。

戻り値 string

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 メソッド

SQL SERVER 2005 から 2008 の ORDER BY/LIMIT/OFFSET 句を構築します。

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

既存のSQL(ORDER BY / LIMIT / OFFSET を含まない)

$orderBy array

order by カラム。このパラメーターの指定方法の詳細については、yii\db\Query::orderBy() を参照してください。

$limit integer|yii\db\Expression

limit 数。詳細については、yii\db\Query::limit() を参照してください。

$offset 整数型

offset 数。詳細については、yii\db\Query::offset() を参照してください。

戻り値 string

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 メソッド (バージョン 2.0.11 から利用可能)

定義元: 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 array

生成されたSQLステートメントにバインドされるパラメータ。これらのパラメータは、クエリの構築プロセス中に生成された追加のパラメータとともに結果に含まれます。

戻り値 array

カラム名、値、パラメータの配列。

例外 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 メソッド (バージョン 2.0.14 から利用可能)

定義元: yii\db\QueryBuilder::prepareInsertValues()

INSERT SQL ステートメントの VALUES 部分を準備します。

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

新しい行が挿入されるテーブル。

$columns array|yii\db\Query

テーブルに挿入するカラムデータ (name => value) または INSERT INTO ... SELECT SQL ステートメントを実行するための Query のインスタンス。

$params array

このメソッドによって生成されるバインドパラメータ。これらは後で DB コマンドにバインドする必要があります。

戻り値 array

カラム名、プレースホルダー、値、パラメータの配列。

                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 メソッド (バージョン 2.0.14 から利用可能)

定義元: yii\db\QueryBuilder::prepareUpdateSets()

UPDATE SQL ステートメントの SET 部分を準備します。

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

更新するテーブル。

$columns array

更新するカラムデータ (name => value)。

$params array

後でDBコマンドにバインドできるように、このメソッドによって変更されるバインドパラメータ。

戻り値 array

UPDATE SQL ステートメントの SET 部分 (最初の配列要素) とパラメータ (2 番目の配列要素) の配列。

                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 メソッド (バージョン 2.0.14 から利用可能)
protected array prepareUpsertColumns ( $table, $insertColumns, $updateColumns, &$constraints = [] )
$table string
$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 メソッド

カラムの名前を変更するための SQL ステートメントを構築します。

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

カラム名を変更するテーブル。メソッドによって名前が適切にクォートされます。

$oldName string

カラムの古い名前。メソッドによって名前が適切にクォートされます。

$newName string

カラムの新しい名前。メソッドによって名前が適切にクォートされます。

戻り値 string

DB カラムの名前を変更するための 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 メソッド

DB テーブルの名前を変更するための SQL ステートメントを構築します。

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

名前を変更するテーブル。メソッドによって名前が適切にクォートされます。

$newName string

新しいテーブル名。メソッドによって名前が適切にクォートされます。

戻り値 string

DB テーブルの名前を変更するための SQL ステートメント。

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

            
resetSequence() public メソッド

テーブルの主キーのシーケンス値をリセットするための SQL ステートメントを作成します。

シーケンスはリセットされ、次に行が挿入される際の主キーが指定された値または1になります。

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

主キーシーケンスをリセットするテーブルの名前

$value mixed

次に行が挿入される際の主キーの値。設定しない場合、次に行の主キーの値は1になります。

戻り値 string

シーケンスをリセットするためのSQLステートメント

例外 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 メソッド (バージョン 2.0.8 から利用可能)

SELECT EXISTS() SQL ステートメントを作成します。

public string selectExists ( $rawSql )
$rawSql string

SELECTの対象となる生の形式のサブクエリ。

戻り値 string

SELECT EXISTS() SQL ステートメント。

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

            
setConditionClasses() public メソッド (バージョン 2.0.14.2 から利用可能)

定義元: yii\db\QueryBuilder::setConditionClasses()

$conditionClasses プロパティのセッター。

$conditionClassesも参照してください。

public void setConditionClasses ( $classes )
$classes string[]

条件エイリアスと条件クラスのマップ。例:

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

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

            
setExpressionBuilders() public メソッド (バージョン 2.0.14 から利用可能)

定義元: yii\db\QueryBuilder::setExpressionBuilders()

$expressionBuilders プロパティのセッター。

$expressionBuilders も参照してください。

public void setExpressionBuilders ( $builders )
$builders string[]

$expressionBuildersプロパティで事前定義されたものとマージされるべきビルダーの配列。

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

            
truncateTable() public メソッド

定義元: yii\db\QueryBuilder::truncateTable()

DB テーブルを切り捨てるための SQL ステートメントを構築します。

public string truncateTable ( $table )
$table string

切り捨てるテーブル。名前はメソッドによって適切にクオートされます。

戻り値 string

DBテーブルを切り捨てるためのSQLステートメント。

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

            
update() public メソッド

UPDATE SQL ステートメントを作成します。

例えば、

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

メソッドは、テーブル名と列名を適切にエスケープします。

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

更新するテーブル。

$columns array

更新するカラムデータ (name => value)。

$condition array|string

WHERE部分に配置される条件。yii\db\Query::where()で条件を指定する方法を参照してください。

$params array

後でDBコマンドにバインドできるように、このメソッドによって変更されるバインドパラメータ。

戻り値 string

UPDATE SQL

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

            
upsert() public メソッド (バージョン 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 string

新しい行が挿入/更新されるテーブル。

$insertColumns array|yii\db\Query

テーブルに挿入される列データ(名前 => 値)またはINSERT INTO ... SELECT SQLステートメントを実行するためのyii\db\Queryのインスタンス。

$updateColumns array|boolean

列データがすでに存在する場合に更新される列データ(名前 => 値)。 trueが渡された場合、列データは挿入列データと一致するように更新されます。falseが渡された場合、列データがすでに存在する場合は更新は実行されません。

$params array

このメソッドによって生成されるバインドパラメータ。これらは後で DB コマンドにバインドする必要があります。

戻り値 string

結果のSQL。

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