ActiveRecord-Batch-Einfügung (yii2) [closed]

Lesezeit: 2 Minuten

Benutzer-Avatar
Benutzer1561346

Ist es möglich, mit ActiveRecord von Yii mehrere Zeilen in eine Abfrage einzufügen? Oder geht das nur über die untergeordneten DAO-Objekte?

Ich habe zwei Modelle 1-Transaktion 2-TransactionItems

Es gibt mehrere Zeilen (onclick add row) in Transaktionselementen.

Ich möchte mehrere Zeilen von Transaktionselementen in der Datenbank speichern.

Screenshot der Transaktionselementtabelle

Benutzer-Avatar
arogachev

Sie können verwenden batchInsert() Methode von yii\db\Command. Siehe Einzelheiten hier. Bei Verwendung mit ActiveRecord Stellen Sie sicher, dass Sie alle Daten vor dem Einfügen validieren.

Angenommen, Sie haben ein Array von $models mit Klasse Postdas geht so:

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

        break;
    }

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

Wenn Modelle keine Validierung erfordern, können Sie den obigen Code mit verkürzen ArrayHelper zum Bauen $rows Reihe.

use yii\helpers\ArrayHelper;

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

Dann einfach Batch Insert ausführen:

$postModel = new Post;

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

PS Die $postModel Wird nur zum Abrufen der Namensliste von Attributen verwendet. Sie können dies auch aus jedem vorhandenen $model in Ihrem $models-Array abrufen.

Wenn Sie nicht alle Attribute einfügen müssen, können Sie dies beim Ausfüllen angeben $rows Array:

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

Ersetzen nicht vergessen $postModel->attributes zu ['title', 'content'].

Bei einer größeren Anzahl von Attributen können Sie einige Array-Funktionen verwenden, um genaue Attribute zum Einfügen anzugeben.

  • Die Antwort lautet also nein? Ich sollte DAO verwenden.

    – Benutzer1561346

    8. Dezember 2014 um 11:34 Uhr

  • Ich denke, dass ActiveRecord dies derzeit nicht standardmäßig unterstützt. Du kannst noch etwas recherchieren, aber ich finde es nicht.

    – arogachev

    8. Dezember 2014 um 11:40 Uhr


  • $postModel->attributes sollte $postModel->attributes() sein

    – Dodo

    30. Mai 2015 um 12:02 Uhr


  • @Dodo Danke für die Bemerkung, korrigierte die Antwort.

    – arogachev

    30. Mai 2015 um 12:23 Uhr

  • @arogachev: Wie kann ich alle Laster-Einfügungs-IDs in der Stapeleinfügung abrufen?

    – Santosch

    16. November 2015 um 11:53 Uhr

1228310cookie-checkActiveRecord-Batch-Einfügung (yii2) [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy