我正在Laravel 4.2中保存一个复杂的数据集,我正在寻找改进方法。
$bits
有几个$bobs
。单个$bob
可以是几个不同类别中的一个。我正在尝试复制单个$bit
及其所有关联的$bobs
,并尽可能少地将所有这些内容保存到数据库中。
$newBit = $this->replicate();
$newBit->save();
$bobsPivotData = [];
foreach ($this->bobs as $index => $bob) {
$newBob = $bob->replicate();
$newBobs[] = $newBob->toArray();
$bobsPivotData[] = [
'bit_id' => $newBit->id,
'bob_type' => get_class($newBob),
'bob_id' => $newBob->id,
'order' => $index
];
}
// I now want to save all the $bobs kept in $newBobs[]
DB::table('bobs')->insert($newBobs);
// Saving all the pivot data in one go
DB::table('bobs_pivot')->insert($bobsPivotData);
我的问题在于,我在循环后插入$newBob->id
之前无法访问$newBob
。
我正在寻找如何最好地减少对数据库的保存。我最好的猜测是,如果我可以预测将要使用的id
,我可以在一个循环中完成所有这些操作。有没有办法预测这些id
?
或者有更好的方法吗?
答案 0 :(得分:0)
您可以先插入bobs,然后使用生成的ID插入位。这在多用户环境中不是一个很好的解决方案,因为在过渡期间可能会插入新的bobs,这可能会搞砸,但它可以满足您的应用。
$newBit = $this->replicate();
$newBit->save();
$bobsPivotData = [];
foreach ($this->bobs as $bob) {
$newBob = $bob->replicate();
$newBobs[] = $newBob->toArray();
}
$insertId = DB::table('bobs')->insertGetId($newBobs);
$insertedBobs = DB::table('bobs')->where('id', '>=', $insertId);
foreach($insertedBobs as $index => $newBob){
$bobsPivotData[] = [
'bit_id' => $newBit->id,
'bob_type' => get_class($newBob),
'bob_id' => $newBob->id,
'order' => $index
];
}
// Saving all the pivot data in one go
DB::table('bobs_pivot')->insert($bobsPivotData);
我没有对此进行过测试,因此可以预期一些伪代码。