Как получить последние вставленные идентификаторы в laravel

Я вставляю несколько строк одновременно, скажем, 2 строки

$multiple_rows = [
    ['email' => '[email protected]', 'votes' => 0],
    ['email' => '[email protected]', 'votes' => 0]
];
DB::table('users')->insert($multiple_rows);

Как я могу получить эти вставленные идентификаторы.

Я делаю это, таким образом, пока.

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

Любой другой хороший способ сделать это, не вставляя каждый раз одну строку.


person Believe It or Not    schedule 20.02.2016    source источник
comment
Как вы вставляете данные? Это исходит из формы? Если бы вы знали, сколько строк вставляется каждый раз, вы могли бы просто упорядочить по столбцу created_at по убыванию и взять необходимое количество строк.   -  person James    schedule 20.02.2016
comment
попробуй с insertGetId()   -  person Renjith V R    schedule 20.02.2016
comment
@James Нет, количество строк динамическое, оно может быть от 1 до 20.   -  person Believe It or Not    schedule 20.02.2016
comment
@yahoo Можете ли вы предоставить мне полный синтаксис для insertGetId() для нескольких строк, на самом деле я пытался, но это дает мне ошибку :(   -  person Believe It or Not    schedule 20.02.2016


Ответы (2)


Вы можете сделать что-то вроде следующего:

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

$multiple_rows = [
    ['email' => '[email protected]', 'votes' => 0],
    ['email' => '[email protected]', 'votes' => 0]
];

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

$users = DB::table('users')->select('id')->where('id', '>', $latestUser->id)->get();
person user2094178    schedule 20.02.2016
comment
А что если кто-то выполнит один и тот же запрос параллельно? Последний получит больше идентификаторов, чем ожидалось, включая те, которые были вставлены параллельными запросами. - person JustAMartin; 19.10.2017
comment
Большинство вариантов использования покрывается внутренними блокирующими методами, генерирующими процесс очереди, но есть много других способов справиться с этим. Что будет отдельным вопросом. - person user2094178; 20.10.2017

Если вам действительно нужны все вставленные идентификаторы

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

$ids = [];

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

}

Чтобы получить все идентификаторы с массивной вставкой, я думаю, что хороший способ - сначала получить последний идентификатор в таблице, сделать массивную вставку и получить последний идентификатор. Теоретически они должны следовать, если не было вставки из другого соединения. Чтобы избежать этого, решением является транзакция.

Обновить

Также прочтите документацию.

person Renjith V R    schedule 20.02.2016