批量插入并获得返回的ids laravel

时间:2017-09-04 15:02:56

标签: php mysql laravel

我有一个像这样的数组:

 0 => array:2 [
    "name" => "Data1"
    "type" => "value1"
  ],
 1 => array:2 [
    "name" => "Data2"
    "type" => "value2"
  ]

我希望将它们插入到数据库中的单个查询中,并检索它们的ID而无需任何其他查询。

到目前为止,我已尝试insertGetId

MyModel::insertGetId($array)

但我注意到它会插入批量行但返回最后一个ID。

2 个答案:

答案 0 :(得分:4)

你可以从表中获取最后的ID ..然后在插入后添加最后一个ID到你的数组的计数..但你将面临一个问题,那就是你有2个或更多用户插入一些记录同时进入此表..所以你可以使用交易

 try{
    DB::beginTransaction();

   // 1- get the last id of your table ($lastIdBeforeInsertion)

   // 2- insert your data
    Model::insert($array);

  // 3- Getting the last inserted ids
  $insertedIds = [];
  for($i=1; $i<=theCountOfTheArray; $i++)
     array_push($insertedIds, $lastIdBeforeInsertion+$i);

});

    DB::commit();
}catch(\Exception $e){
    DB::rollback();
}

DB::transaction(function() {

   // 1- get the last id of your table ($lastIdBeforeInsertion)

   // 2- insert your data
   Model::insert($array);

  // 3- Getting the last inserted ids
  $insertedIds = [];
  for($i=1; $i<=theCountOfTheArray; $i++)
     array_push($insertedIds, $lastIdBeforeInsertion+$i);

});

Database Transaction Documentation

Very Useful Article About Database Transactions

修改

您可以创建一个唯一的列并将其调用为示例unique_bulk_id ..这将为插入的数据保留随机生成的字符串..插入后,您可以通过此unique_bulk_id获取插入的数据。

答案 1 :(得分:0)

我使用这种方法插入非重复数据。

但是这种方法会消耗性能。

class TestController extends Controller
{
    public function test()
    {

        DB::transaction(function () {

            $insertedIds = [];
            //the name key is unique, so i use the firstOrCreate method
            for ($i = 0; $i < 10; $i++) {
                $tag = Tags::firstOrCreate(['name' => 30 + $i]);
                $id = $tag->id;
                array_push($insertedIds, $id);
            }

            dump($insertedIds);
        });

    }
}