【问题标题】:How to get last inserted ids in laravel如何在laravel中获取最后插入的ID
【发布时间】:2016-06-01 23:15:21
【问题描述】:

我同时插入多行,比如 2 行

$multiple_rows = [
    ['email' => 'taylor@example.com', 'votes' => 0],
    ['email' => 'dayle@example.com', 'votes' => 0]
];
DB::table('users')->insert($multiple_rows);

我怎样才能得到那些插入的 id。

我正在这样做,暂时这样。

foreach($multiple_rows as $row){
  DB::table('users')->insert($row);
  $record_ids[] = DB::getPdo()->lastInsertId();
}

任何其他好方法,无需每次插入单行。

【问题讨论】:

  • 你是如何插入数据的?它来自一个表格吗?如果您知道每次插入了多少行,那么您可以按created_at 列的降序排列并获取所需的行数。
  • 试试insertGetId()
  • @James 不,行数是动态的,可以是 1-20。
  • @yahoo 你能为我提供多行的 insertGetId() 的完整语法吗,实际上我试过但它给了我错误:(

标签: php laravel laravel-5.2


【解决方案1】:

您可以执行以下操作:

$latestUser = DB::table('users')->select('id')->orderBy('id', 'DESC')->first();

$multiple_rows = [
    ['email' => 'taylor@example.com', 'votes' => 0],
    ['email' => 'dayle@example.com', 'votes' => 0]
];

DB::table('users')->insert($multiple_rows);

$users = DB::table('users')->select('id')->where('id', '>', $latestUser->id)->get();

【讨论】:

  • 如果有人并行执行相同的请求怎么办?最后一个将收到比预期更多的 id,包括由并行请求插入的 id。
  • 大多数用例都包含在生成队列进程的内部锁定方法中,但还有很多其他方法可以处理这种情况。这将是一个单独的问题。
【解决方案2】:

如果你真的需要所有插入的ID

$dataArray = [
    ['name' => 'ABC'],
    ['name' => 'DEF']
];

$ids = [];

foreach($dataArray as $data)
{
     $ids[] = DB::table('posts')->insertGetId($data);

}

要通过大量插入获取所有 id,我认为最好的方法是首先获取表中的最后一个 id,然后进行大量插入并获取最后一个 id。理论上它们必须遵循,除非有来自另一个连接的插入。为避免解决方案是 transaction

更新

另请阅读documentation

【讨论】:

    猜你喜欢
    • 2016-10-24
    • 1970-01-01
    • 2015-03-08
    • 2015-09-13
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    相关资源
    最近更新 更多