web-dev-qa-db-fra.com

Insertion en vrac à Laravel avec ORM éloquent

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.

108
phoenixwizard

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);
229
GTF

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);
57

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;
}
22
Alex

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);
11

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],
    ..................................
]);
3
srmilon

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.

1
sumit

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)

0
justnajm