wake-up-neo.com

Bulk-Insertion in Laravel mit eloquentem ORM

Wie können Bulk-Datenbank-Einfügungen in Laravel mit Eloquent ORM durchgeführt werden?

Ich möchte dies in Laravel erreichen: https://stackoverflow.com/a/10615821/600516 Ich erhalte jedoch die folgende Fehlermeldung.

SQLSTATE [HY093]: Ungültige Parameternummer: gemischte benannte und Positionsparameter.

108
phoenixwizard

Sie können einfach Eloquent::insert() verwenden.

Zum Beispiel:

$data = array(
    array('name'=>'Coder 1', 'rep'=>'4096'),
    array('name'=>'Coder 2', 'rep'=>'2048'),
    //...
);

Coder::insert($data);
229
GTF

Wir können die GTF-Antwort einfach aktualisieren, um Zeitstempel zu aktualisieren

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

Update: Um das Datum zu vereinfachen, können wir Kohlenstoff als von @Pedro Moreira empfohlenes verwenden 

$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: Für Laravel 5 verwenden Sie updated_at anstelle von 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

Wer dies liest, kann sich die createMany()-Methode anschauen.

/**
 * 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

So machen Sie es auf beredte Weise, 

    $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

Ich habe oft danach gesucht und schließlich benutzerdefinierte timestamps wie folgt verwendet:

$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 ist die richtige Lösung, aktualisiert jedoch nicht die Zeitstempel, so dass Sie etwas wie unten beschrieben tun können

 $json_array=array_map(function ($a) { 
                        return array_merge($a,['created_at'=> 
                                            Carbon::now(),'updated_at'=> Carbon::now()]
                                           ); 
                                     }, $json_array); 
 Model::insert($json_array);

Die Idee besteht darin, created_at und updated_at für das gesamte Array vor dem Einfügen hinzuzufügen

1
sumit

Beim Einfügen von Kategorierelationen stieß ich auf dasselbe Problem und hatte keine Ahnung, außer dass ich in meinem eloquenten Modell Self () verwendete, um eine Instanz derselben Klasse in foreach zu haben, um mehrere Speicherungen aufzuzeichnen und IDs zu erfassen.

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();
    }
}

ohne "$ obj = new Self ()" werden nur einzelne Datensätze gespeichert (wenn $ obj $ this war)

0
justnajm