YiiのActiveRecordを使用して、1つのクエリに複数の行を挿入できますか?または、これは低レベルのDAOオブジェクトを介してのみ可能ですか?
_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']
_に置き換えることを忘れないでください。
大量の属性の場合、いくつかの配列関数を使用して、挿入する正確な属性を指定できます。