大量のデータをmysqlに一括して挿入する必要があります。 500K行ごろ、Laravel 5.3の関係(ハードの部分)とLaravel 5大量挿入との関係
テーブルは自動車、ユーザとuser_vehicleある
平野車の挿入配列は、このようなものになります。
$vehicles = array();
foreach ($data as $val) {
$temp = array(
'license_plate' => $val->license_plate,
'created_at' => $now,
'updated_at' => $now,
'state_id' => $activeState,
'type_id' => $typeId,
);
array_push($vehicles, $temp);
}
を私は正常のようなレコードを挿入することができますこれは:
$vehicles = array_chunk($vehicles, 10000);
foreach ($vehicles as $key => $vehicle) {
Vehicle::insert($vehicle);
}
すべてのデータを挿入するには数秒かかりますが、今ではそれらにリレーションシップを追加する必要があります。 1台の車両は多くのユーザ(所有者、運転手など)に所属できるので、特定の車両に特定のユーザを付ける必要があります。今
、私は関係を追加しようとしたとき、私はこだわっているのはここです:
$vehicles = array();
$vehUsers = array();
$users = Users::get();
foreach ($data as $val) {
// Remap data to right structure
$temp = array(
'license_plate' => $val->license_plate,
'created_at' => $now,
'updated_at' => $now,
'state_id' => $activeState,
'type_id' => $typeId,
);
// Search for right user (This part is really slow)
$userId = $users->where('email', $val->email)->first();
if ($userId) {
$userId = $userId->id;
}
array_push($vehicles, $temp);
// Thought that it might help to save them into array for later use
array_push($vehUsers, $userId);
}
しかし、問題は、私はこの
$vehicles = array_chunk($vehicles, 10000);
foreach ($vehicles as $key => $vehicle) {
Vehicle::insert($vehicle);
// Need to attach user here somehow
}
のようにそれらを挿入することはできませんそして、私は必要なことであり、 1つの挿入によって1 becouse(私の場合は10K)をバルクでそれらを実行することは、私は、インサート車一括することができます
// Insert them and relations one by one and it will take years
foreach ($vehicles as $key => $vehicle) {
$veh = Vehicle::insert($vehicle);
$veh->users()->attach($vehUsers[$key]);
}
どのように時間がかかりすぎます彼らの関係は?
EDIT:遅い部分はDBクエリを実行しています。 PHPで項目をループするのを10〜20秒待つことができます。
コードの最初の部分をありがとう。それは本当に物事をより速く=)そして直接DB_:insert(bulk_data)を使ってvehicle_userに追加します。最初の一括挿入から車両IDを取得する方法を把握していただけです。 –