我在Laravel 4.2中保存了一个复杂的数据集,我正在寻找改进的方法。$bits
有几个$bobs
。一个$bob
可以是几个不同的类之一。我试图复制一个单独的$bit
及其所有相关的$bobs
并用尽可能少的调用将所有这些保存到DB。
$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
s,那么我可以在一个循环中完成所有这一切。有没有办法预测这些id
s?还是有更好的方法?
最佳答案
可以先插入bob,然后使用生成的id插入位。在多用户环境中,这不是一个很好的解决方案,因为在此期间可能会插入新的bob,这可能会使事情变得一团糟,但它可以满足您的应用程序。
$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);
我还没有测试过,所以有些伪代码是意料之中的。
关于php - 在保存到数据库之前预测将来使用的ID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46608897/