我有一个像这样的数组:
0 => array:2 [
"name" => "Data1"
"type" => "value1"
],
1 => array:2 [
"name" => "Data2"
"type" => "value2"
]
我希望将它们插入到数据库中的单个查询中,并检索它们的ID而无需任何其他查询。
到目前为止,我已尝试insertGetId
MyModel::insertGetId($array)
但我注意到它会插入批量行但返回最后一个ID。
答案 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);
});
}
}