Yii の ActiveRecord で 1 つのクエリに複数の行を挿入することは可能ですか? それとも、これは下位レベルの DAO オブジェクトを介してのみ可能ですか?
私は2つのモデルを持っています1-トランザクション2-TransactionItems
トランザクション項目に複数の行 (onclick add 行) があります。
複数行のトランザクション項目をデータベースに格納したいと考えています。
Yii の ActiveRecord で 1 つのクエリに複数の行を挿入することは可能ですか? それとも、これは下位レベルの DAO オブジェクトを介してのみ可能ですか?
私は2つのモデルを持っています1-トランザクション2-TransactionItems
トランザクション項目に複数の行 (onclick add 行) があります。
複数行のトランザクション項目をデータベースに格納したいと考えています。
batchInsert()
の方法が使えますyii\db\Command
。詳細はこちらをご覧ください。一緒に使用する場合は、ActiveRecord
挿入する前にすべてのデータを検証してください。
class を持つ $models の配列があると仮定すると、次のPost
ように実行できます。
$rows = [];
foreach ($models as $model) {
if (!$model->validate()) {
// At least one model has invalid data
break;
}
$rows[] = $model->attributes;
}
モデルが検証を必要としない場合は、配列ArrayHelper
の構築に使用して上記のコードを短縮できます。$rows
use yii\helpers\ArrayHelper;
$rows = ArrayHelper::getColumn($models, 'attributes');
次に、バッチ挿入を実行します。
$postModel = new Post;
Yii::$app->db->createCommand()->batchInsert(Post::tableName(), $postModel->attributes(), $rows)->execute();
PS$postModel
属性名リストをプルするために使用されたばかりで、$models 配列内の既存の $model からプルすることもできます。
すべての属性を挿入する必要がない場合は、$rows
配列を埋めるときに指定できます。
$rows[] = [
'title' => $model->title,
'content' => $model->content,
];
$postModel->attributes
に置き換えることを忘れないでください['title', 'content']
。
大量の属性の場合、いくつかの配列関数を使用して、挿入する正確な属性を指定できます。