2014-12-08 16 views

risposta

42

È possibile utilizzare il metodo batchInsert() di yii\db\Command. Vedere i dettagli here. Quando lo si utilizza con ActiveRecord assicurarsi di convalidare tutti i dati prima di inserirli.

si Assumendo hanno gamma di $ modelli con classe di Post, esso può essere fatto in questo modo:

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

     break; 
    } 

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

Se i modelli non richiedono la convalida è possibile a breve il codice sopra utilizzando ArrayHelper per la costruzione di $rows array.

use yii\helpers\ArrayHelper; 

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

Poi basta eseguire inserto in batch:

$postModel = new Post; 

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

P.S. Lo $postModel viene usato per estrarre la lista dei nomi attirubute, puoi anche estrarlo da qualsiasi modello $ esistente nel tuo array $ models.

Se non è necessario inserire tutti gli attributi è possibile specificare che quando si riempie $rows array:

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

Non dimenticare di sostituire $postModel->attributes a ['title', 'content'].

In caso di una quantità maggiore di attributi è possibile utilizzare alcune funzioni di array per specificare gli attributi esatti per l'inserimento.

+0

Quindi, la risposta è no? Dovrei usare DAO. – user1561346

+0

Penso che attualmente ActiveRecord non supporti questo fuori dalla scatola. Puoi fare ulteriori ricerche, ma non riesco a trovarlo. – arogachev

+1

$ postModel-> gli attributi dovrebbero essere $ postModel-> attributes() – Dodo