Pytanie Wkładka wsadowa ActiveRecord (yii2) [zamknięta]


Czy możliwe jest wstawienie wielu wierszy w jednym zapytaniu z ActiveRecord Yii? Czy jest to możliwe tylko dzięki obiektom DAO niższego poziomu?


32
2017-12-08 09:47


pochodzenie




Odpowiedzi:


Możesz użyć batchInsert() metoda yii\db\Command. Patrz szczegóły tutaj. Używając go z ActiveRecord upewnij się, że sprawdzasz wszystkie dane przed wstawieniem.

Zakładając, że masz tablicę modeli $ z klasą Post, można to zrobić tak:

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

        break;
    }

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

Jeśli modele nie wymagają sprawdzania poprawności, możesz skrócić powyższy kod za pomocą ArrayHelper do budowania $rows szyk.

use yii\helpers\ArrayHelper;

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

Następnie po prostu wykonaj wkładkę wsadową:

$postModel = new Post;

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

P.S. The $postModel tylko do wyciągnięcia listy nazwisk attirubute, możesz też wyciągnąć to z dowolnego istniejącego modelu $ w tablicy $ models.

Jeśli nie musisz wstawiać wszystkich atrybutów, możesz je określić podczas wypełniania $rows szyk:

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

Nie zapomnij wymienić $postModel->attributes do ['title', 'content'].

W przypadku większej ilości atrybutów można użyć niektórych funkcji tablicowych do określenia dokładnych atrybutów do wstawienia.


47
2017-12-08 11:14



Tak więc odpowiedź brzmi "nie"? Powinienem użyć DAO. - user1561346
Myślę, że obecnie ActiveRecord nie obsługuje tego po wyjęciu z pudełka. Możesz wykonać dalsze badania, ale nie mogę ich znaleźć. - arogachev
$ postModel-> atrybuty powinny być $ postModel-> attributes () - Dodo
@Dodo Dzięki za uwagę, poprawiono odpowiedź. - arogachev
@arogachev: w jaki sposób można uzyskać cały wstawiony identyfikator Laster we wsadzie wsadowym? - Santosh