2016-02-20 3 views
3

Я вставляя несколько строк одновременно, скажем, 2 строкиКак получить последний вставленные Идентификаторы в Laravel

$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(); 
} 

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

+0

Как вы вставляя данные? Это исходит из формы? Если бы вы знали, сколько строк вставлялось каждый раз, тогда вы можете просто упорядочить по столбцу 'created_at', опустившись и взять необходимое количество строк. – James

+0

попробуйте с 'insertGetId()' –

+0

@James Нет, количество строк динамическое, оно может быть 1-20. –

ответ

7

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

$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(); 
+0

Ваша идея потрясающая! Thank bro –

+0

А что, если кто-то выполняет параллельный запрос? будет получать больше идентификаторов, чем ожидалось, в том числе те, которые вставлены параллельными запросами. – JustAMartin

+0

Большинство случаев использования покрываются методами внутренней блокировки, генерирующими процесс очереди, но есть много других способов справиться с этим. Это будет отдельный вопрос. – user2094178

4

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

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

$ids = []; 

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

} 

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

Update

прочитать также documentation

Смежные вопросы