web-dev-qa-db-ja.com

ActiveRecordバッチ挿入(yii2)

YiiのActiveRecordを使用して、1つのクエリに複数の行を挿入できますか?または、これは低レベルのDAOオブジェクトを介してのみ可能ですか?

34
user1561346

_yii\db\Command_のbatchInsert()メソッドを使用できます。詳細を参照してください こちらActiveRecordで使用する場合は、挿入する前にすべてのデータを検証してください。

クラスPostを持つ$ modelsの配列があると仮定すると、次のようになります:

_$rows = [];
foreach ($models as $model) {
    if (!$model->validate()) {
        // At least one model has invalid data

        break;
    }

    $rows[] = $model->attributes;
}
_

モデルが検証を必要としない場合は、_$rows_配列を構築するためにArrayHelperを使用して上記のコードを短縮できます。

_use yii\helpers\ArrayHelper;

$rows = ArrayHelper::getColumn($models, 'attributes');
_

次に、単にバッチ挿入を実行します。

_$postModel = new Post;

Yii::$app->db->createCommand()->batchInsert(Post::tableName(), $postModel->attributes(), $rows)->execute();
_

追伸_$postModel_は、属性名リストを取得するために使用されますが、$ models配列内の既存の$ modelから取得することもできます。

すべての属性を挿入する必要がない場合は、_$rows_配列を埋めるときに指定できます。

_$rows[] = [
    'title' => $model->title,
    'content' => $model->content,
];
_

_$postModel->attributes_を_['title', 'content']_に置き換えることを忘れないでください。

大量の属性の場合、いくつかの配列関数を使用して、挿入する正確な属性を指定できます。

51
arogachev