在 Laravel 中进行批量插入后如何获取记录 ID

11

我正在使用laravel 5.4,我想在将记录插入表中后获取它们的ID。这是我想要插入的数据,它存储在数组中。

$data = [
  [
    "count" => "100",
    "start_date" => 1515628800
  ],
  [
    "count" => "102",
    "start_date" => 1515715200
  ]
];

在这里我一次性插入了项目数组

\Auth::user()->schedule()->insert($data);

但是这个方法返回布尔值,我想在插入新项目后获取它们的ID(或所有列),我该怎么做呢?无论是使用eloquent还是querybuilder都可以。我已经尝试过insertGetId方法,但似乎不能用于多维数组。如果在laravel中不可能实现,那么最好的实现方式是什么?


1
迭代并使用insertGetId() - Mahdi Younesi
2个回答

3

解决方法:选择最高的主键值,就可以知道它们的值是什么。但是,您可能需要锁定以防止与其他用户竞争。

编辑:

LOCK TABLES schedule WRITE;

// 选择最后一个ID

UNLOCK TABLES;

ID列表即为最后一个ID - 插入计数


请问您能否更具体一些?在我插入数据后,我应该锁定表并检索最后2条记录(例如)? - devnull Ψ
我从未见过有人在真实项目中使用这种方法。这种方法有什么缺点吗? - Alexey Mezenin
2
说实话:我不知道,因为我没有尝试过。然而,其他选择并不多。此外,在有很多同时用户的情况下,锁定表并不完美。 - online Thomas
@AlexeyMezenin 是的,因为操作在节点之间不是同步的,你可以插入1000个,其他无关的进程/应用程序等也可以在此期间/之后添加1个或更多,然后当你去获取最后一个时,你会少1个(或者有多少个)。将查询包装在事务中。首先计算ID,然后指定它们进行插入。这样,如果存在竞争条件(如上所述),并且无法插入某些内容,则事务将撤消所有操作,您可以执行任何需要解决的操作(例如重试或其他操作)。 - jmcgrory

1

我的方法是在服务器端生成ID,每次遇到这个问题时都要这样做,但必须确保ID是唯一的。此外,您可以仅对需要的表执行此操作(而不是整个数据库)。希望这可以帮助到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接