预测在保存到数据库之前使用的未来ID

时间:2017-10-06 15:13:13

标签: php mysql laravel laravel-4

我正在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

或者有更好的方法吗?

1 个答案:

答案 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);

我没有对此进行过测试,因此可以预期一些伪代码。