我想问一下你是否有人试图在相关表格中一次插入多条记录? 这是场景。我有一张药物和药物运动表。现在我想使用xls文件作为源将记录插入到两个表中。所以这个xls文件包含数千条记录。到用户上传该文件时。该文件的所有内容都将插入表中。现在我正在考虑批量上传。但我不知道最好的方法是什么。
以下是架构
========药物表==========
class Drug extends Model
{
public function drugMovements() {
return $this->hasMany('App\DrugMovement');
}
}
========药物运动===========
class DrugMovement extends Model
{
public function drug() {
return $this->belongsTo('App\Drug');
}
}
现在我想将记录保存到这个表中,同时插入一千条记录。我怎样才能做到这一点? 如果我做这样的事情,那么这将浪费资源,因为我需要循环到所有记录并进行数千次插入。
foreach($datas as $data) {
$drug = Drug::create([
"pharmacy_id" => 1,
"name" => $data->drug_name,
"strength" => $data->strength,
]);
$drug_movements = new DrugMovement([
"drug_id" => $drug->id,
"quantity" => $data->quantity,
"pharmacist_id" => 1,
]);
$drug->drugMovements()->save($drug_movements);
$drug->save();
}
正如您所看到的,如果数据有数千条记录,它将插入数千次。我该如何优化呢?
答案 0 :(得分:0)
最好的办法是制作两个数组,然后将它们插入数据库。
$latestDrugID = Drug::max('id');
// Of course if your database is empty start from `1`
foreach($datas as $data) {
$drugs[] = [
"pharmacy_id" => 1,
"name" => $data->drug_name,
"strength" => $data->strength,
];
$drug_movements[] = [
"drug_id" => $latestDrugID++,
"quantity" => $data->quantity,
"pharmacist_id" => 1,
];
}
Drug::insert($drugs);
DrugMovement::insert($drug_movements);
PS:您可能希望将这些数组分成小块,具体取决于数据的大小。