Я использую Laravel 4, и мне нужно вставить некоторые строки в таблицу MySQL, и мне нужно вернуть их вставленные идентификаторы.
Для одной строки я могу использовать ->insertGetId()
, однако она не поддерживает несколько строк. Если бы я мог хотя бы извлечь идентификатор первой строки, как это делает обычный MySQL, было бы достаточно, чтобы выяснить другие. Есть идеи?
Как предложил пользователь Xrymz, DB::raw('LAST_INSERT_ID();')
возвращает первый.
Согласно Schema api insertGetId()
принимает массив
public int insertGetId(array $values, string $sequence = null)
Таким образом, вы должны быть в состоянии сделать
DB::table('table')->insertGetId($arrayValues);
Говоря, если вы используете MySQL, вы можете извлечь первый id и вычислить остальное. Существует также DB::getPdo()->lastInsertId();
функции, которые могли бы помочь.
Или, если он вернул последний идентификатор с помощью некоторых из этих методов, вы можете рассчитать его обратно к первому вставленному тоже.
РЕДАКТИРОВАТЬ
Согласно комментариям, мои предложения могут быть неправильными.
Что касается вопроса «что, если строка вставлена другим пользователем между ними», это зависит от механизма хранилища. Если используется механизм с блокировкой уровня стола ( MyISAM , MEMORY и MERGE ), тогда вопрос неупорядочен, так как не может быть двух одновременных записей в таблицу.
Если используется механизм блокировки на уровне строк ( InnoDB ), то другой возможностью может быть просто вставить данные, а затем извлечь все строки некоторым известным полем whereIn()
или выяснить блокировку уровня таблицы .
Это поведение mysql last-insert-id
Важный
Если вы вставляете несколько строк с помощью одного оператора INSERT, LAST_INSERT_ID () возвращает значение, сгенерированное только для первой вставленной строки. Причина этого заключается в том, чтобы дать возможность легко воспроизвести тот же оператор INSERT против какого-либо другого сервера.
u можете попробовать использовать много вставки и принять его идентификаторы или после сохранения, попробуйте использовать $ data-> id, который должен быть последним вставленным id.