Comment pouvons-nous effectuer des insertions en bloc de bases de données dans Laravel avec Eloquent ORM?
Je veux accomplir ceci dans Laravel: https://stackoverflow.com/a/10615821/600516 , Mais je reçois l'erreur suivante.
SQLSTATE [HY093]: Numéro de paramètre non valide: paramètres nommés et positionnels mélangés.
Vous pouvez simplement utiliser Eloquent::insert()
.
Par exemple:
$data = array(
array('name'=>'Coder 1', 'rep'=>'4096'),
array('name'=>'Coder 2', 'rep'=>'2048'),
//...
);
Coder::insert($data);
Nous pouvons mettre à jour la réponse GTF pour mettre à jour les horodatages facilement
$data = array(
array(
'name'=>'Coder 1', 'rep'=>'4096',
'created_at'=>date('Y-m-d H:i:s'),
'modified_at'=> date('Y-m-d H:i:s')
),
array(
'name'=>'Coder 2', 'rep'=>'2048',
'created_at'=>date('Y-m-d H:i:s'),
'modified_at'=> date('Y-m-d H:i:s')
),
//...
);
Coder::insert($data);
Mise à jour: Pour simplifier la date, nous pouvons utiliser le carbone, comme le suggère @ Pedro Moreira
$now = Carbon::now('utc')->toDateTimeString();
$data = array(
array(
'name'=>'Coder 1', 'rep'=>'4096',
'created_at'=> $now,
'modified_at'=> $now
),
array(
'name'=>'Coder 2', 'rep'=>'2048',
'created_at'=> $now,
'modified_at'=> $now
),
//...
);
Coder::insert($data);
UPDATE2: pour laravel 5, utilisez updated_at
au lieu de modified_at
$now = Carbon::now('utc')->toDateTimeString();
$data = array(
array(
'name'=>'Coder 1', 'rep'=>'4096',
'created_at'=> $now,
'updated_at'=> $now
),
array(
'name'=>'Coder 2', 'rep'=>'2048',
'created_at'=> $now,
'updated_at'=> $now
),
//...
);
Coder::insert($data);
Pour qui lit ceci, consultez createMany()
, méthode .
/**
* Create a Collection of new instances of the related model.
*
* @param array $records
* @return \Illuminate\Database\Eloquent\Collection
*/
public function createMany(array $records)
{
$instances = $this->related->newCollection();
foreach ($records as $record) {
$instances->Push($this->create($record));
}
return $instances;
}
Voici comment vous le faites de manière plus éloquente,
$allintests = [];
foreach($intersts as $item){ //$intersts array contains input data
$intestcat = new User_Category();
$intestcat->memberid = $item->memberid;
$intestcat->catid= $item->catid;
$allintests[] = $intestcat->attributesToArray();
}
User_Category::insert($allintests);
J'ai cherché à plusieurs reprises, finalement utilisé timestamps
personnalisé comme ci-dessous:
$now = Carbon::now()->toDateTimeString();
Model::insert([
['name'=>'Foo', 'created_at'=>$now, 'updated_at'=>$now],
['name'=>'Bar', 'created_at'=>$now, 'updated_at'=>$now],
['name'=>'Baz', 'created_at'=>$now, 'updated_at'=>$now],
..................................
]);
Eloquent::insert
est la solution appropriée mais il ne mettra pas à jour les horodatages, vous pouvez donc faire quelque chose comme ci-dessous
$json_array=array_map(function ($a) {
return array_merge($a,['created_at'=>
Carbon::now(),'updated_at'=> Carbon::now()]
);
}, $json_array);
Model::insert($json_array);
L'idée est d'ajouter created_at et updated_at sur tout le tableau avant de faire l'insertion.
Pour l'insertion de relations de catégorie, je suis tombé sur le même problème et je n'en avais aucune idée, sauf que, dans mon modèle éloquent, j'utilisais Self () pour avoir une instance de la même classe dans foreach afin d'enregistrer plusieurs enregistrements de sauvegarde et d'identification.
foreach($arCategories as $v)
{
if($v>0){
$obj = new Self(); // this is to have new instance of own
$obj->page_id = $page_id;
$obj->category_id = $v;
$obj->save();
}
}
sans "$ obj = new Self ()", il n'enregistre qu'un seul enregistrement (lorsque $ obj était $ this)