gpt4 book ai didi

php - 在保存到数据库之前预测 future 使用的 ID

转载 作者:行者123 更新时间:2023-11-29 03:20:10 24 4
gpt4 key购买 nike

我正在 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 之前,我无法访问 $newBob->id

我正在寻找如何最好地减少对数据库的保存。我最好的猜测是,如果我能预测将要使用的 id,我就可以在一个循环中完成所有这些。有什么方法可以预测这些 id 吗?

或者有更好的方法吗?

最佳答案

您可以先插入 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 - 在保存到数据库之前预测 future 使用的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46608897/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com