我在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
我正在寻找如何最好地减少节省数据库。我最好的猜测是,如果我能够预测将要使用的ids,那么我可以在一个循环中完成所有这一切。有没有办法预测这些ids?
还是有更好的方法?

最佳答案

可以先插入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/

10-12 00:24
查看更多