php - example - order by yii2
InserciĆ³n de lote de ActiveRecord(yii2) (1)
¿Es posible insertar varias filas en una consulta con el ActiveRecord de Yii? ¿O esto solo es posible a través de los objetos DAO de nivel inferior?
Puede usar el método batchInsert()
de yii/db/Command
. Ver detalles here . Al usarlo con ActiveRecord
asegúrese de validar todos los datos antes de insertarlos.
Suponiendo que tiene una matriz de $ modelos con clase Post
, se puede hacer así:
$rows = [];
foreach ($models as $model) {
if (!$model->validate()) {
// At least one model has invalid data
break;
}
$rows[] = $model->attributes;
}
Si los modelos no requieren validación, puede abreviar el código anterior utilizando ArrayHelper
para ArrayHelper
$rows
array.
use yii/helpers/ArrayHelper;
$rows = ArrayHelper::getColumn($models, ''attributes'');
Luego, simplemente ejecuta la inserción por lotes:
$postModel = new Post;
Yii::$app->db->createCommand()->batchInsert(Post::tableName(), $postModel->attributes(), $rows)->execute();
PD: el $postModel
acaba de usar para extraer la lista de nombres de attirubute, también puede extraerlo de cualquier modelo $ existente en su matriz de $ modelos.
Si no necesita insertar todos los atributos, puede especificarlo al completar $rows
array:
$rows[] = [
''title'' => $model->title,
''content'' => $model->content,
];
No olvides reemplazar $postModel->attributes
por [''title'', ''content'']
.
En el caso de una mayor cantidad de atributos, puede usar algunas funciones de matriz para especificar los atributos exactos para insertar.