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