37

Yii の ActiveRecord で 1 つのクエリに複数の行を挿入することは可能ですか? それとも、これは下位レベルの DAO オブジェクトを介してのみ可能ですか?

私は2つのモデルを持っています1-トランザクション2-TransactionItems

トランザクション項目に複数の行 (onclick add 行) があります。

複数行のトランザクション項目をデータベースに格納したいと考えています。

トランザクション項目テーブルのスクリーンショット

4

1 に答える 1

61

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']

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

于 2014-12-08T11:14:28.853 に答える