Quindi, è possibile inserire più righe in una query con ActiveRecord, oppure è meglio utilizzare DAO per questo?Inserimento batch ActiveRecord (yii2)
risposta
È 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.
Quindi, la risposta è no? Dovrei usare DAO. – user1561346
Penso che attualmente ActiveRecord non supporti questo fuori dalla scatola. Puoi fare ulteriori ricerche, ma non riesco a trovarlo. – arogachev
$ postModel-> gli attributi dovrebbero essere $ postModel-> attributes() – Dodo