dongyu9894
2017-09-04 15:02
浏览 1.3k
已采纳

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

I have an array like this one :

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

i want to insert them in single query in the database and retrieve their ids without any additional query.

So far i have tried insertGetId

MyModel::insertGetId($array)

but i have noticed it inserts bulk rows but return the last id.

图片转代码服务由CSDN问答提供 功能建议

我有一个像这样的数组:

  0 =  > 数组:2 [
“name”=>  “Data1”
“type”=>  “value1”
],
 1 => 数组:2 [
“name”=>  “Data2”
“type”=>  “value2”
] 
   
 
 

我想在数据库中的单个查询中插入它们并检索它们的ID而不需要任何其他查询。 \ n

到目前为止,我已经尝试了 insertGetId

  MyModel :: insertGetId($ array)
   \  n 
 

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

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • doumu1212 2017-09-05 01:03
    已采纳

    Well You Can Get The Last Id from the table .. Then After The Insertion Add The Last id To The Count of your array .. But you Will face a problem and that is if you have 2 or more users inserted some records into this table at the same time .. so you can use The Transaction

     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();
    }
    

    or

    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

    Edit

    You Can make a unique Column and Call it for Example unique_bulk_id .. This will hold randomly generated string for the inserted data .. after the insertion you can get the inserted data by This unique_bulk_id.

    打赏 评论
  • doume5227 2019-05-18 13:40

    I use this method to insert non-duplicate data.

    But this method consumes performance.

    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);
            });
    
        }
    }
    
    
    打赏 评论

相关推荐 更多相似问题