【问题标题】:get record ids after bulk insert in laravel在laravel中批量插入后获取记录ID
【发布时间】:2020-05-21 17:35:03
【问题描述】:

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

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

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

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

但是这个方法返回boolean,我想在插入这些新项目后获取它们的ID(或所有列),我应该怎么做?用eloquent 或querybuilder 完成都没有关系。我已经尝试过insertGetId 方法,但它似乎不适用于多维数组。如果 laravel 无法实现,那么实现这一点的最佳方法是什么?

【问题讨论】:

  • 遍历然后使用 insertGetId()

标签: php laravel laravel-5


【解决方案1】:

解决方法:选择最高的 PK 值,您应该知道它们的值。不过,您可能需要锁定以防止与其他用户竞争。

编辑:

LOCK TABLES 计划写入;

// 选择最后一个ID

解锁表格;

id 的列表就是last id - insert count

【讨论】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 2018-02-12
    • 2015-03-06
    • 2018-11-06
    • 1970-01-01
    • 2014-08-25
    • 2020-02-06
    相关资源
    最近更新 更多