Получить последний введенный идентификатор с помощью Laravel Eloquent


294

В настоящее время я использую приведенный ниже код для вставки данных в таблицу:

<?php

public function saveDetailsCompany()
{
    $post = Input::All();

    $data = new Company;
    $data->nombre = $post['name'];
    $data->direccion = $post['address'];
    $data->telefono = $post['phone'];
    $data->email = $post['email'];
    $data->giro = $post['type'];
    $data->fecha_registro = date("Y-m-d H:i:s");
    $data->fecha_modificacion = date("Y-m-d H:i:s");

    if ($data->save()) {
        return Response::json(array('success' => true), 200);
    }
}

Я хочу вернуть последний введенный идентификатор, но не знаю, как его получить.

С уважением!

Ответы:


378

После Спасите , $data->idдолжен быть последним идентификатор вставляется.

$data->save();
$data->id;

Можно использовать как это.

return Response::json(array('success' => true, 'last_insert_id' => $data->id), 200);

Для обновленной версии Laravel попробуйте это

return response()->json(array('success' => true, 'last_insert_id' => $data->id), 200);

2
Объект всегда возвращает объект, ofc. Это единственный путь.
Кас Блум

40
Помните, что если идентификатор НЕ является автоинкрементом, он всегда будет возвращаться 0. В моем случае идентификатором была строка (UUID), и чтобы это работало, мне пришлось добавить public $incrementing = false;в мою модель.
Луис Крус

2
@milz У меня есть триггер MySQL, который генерирует uuid для настраиваемого поля с именем, aidи я установил, $incrementing = false;но он тоже не возвращается!
SaidbakR

@SaidbakR в то время как true, пожалуйста, не могли бы вы указать раздел документа Laravel, где вы получили эту очень важную информацию?
Дамилола Оловукер

@DamilolaOlowookere Это то, что я нашел в своем приложении, которое использует Laravel 5.4.
SaidbakR

121

xdazz прав в этом случае, но в интересах будущих посетителей, которые могут использовать DB::statementили DB::insert, есть другой способ:

DB::getPdo()->lastInsertId();

43
На самом деле вы можете сделать это прямо во вставке$id = DB::table('someTable')->insertGetId( ['field' => Input['data']);
Кейси

1
@ Кейси, делающий это таким образом, не будет обновлять временные метки в БД
Рафаэль

@Rafael, если вы хотите обновить timestampsс помощью insertGetId, пожалуйста, проверьте здесь
Frank Myat Thu

Именно то, что я искал на днях! Кроме того, insertGetIdработает только в том случае, если столбцы идентификаторов на самом деле называется «идентификатор».
Капитан Гипертекст

@Benubird, у меня есть решение по вашему ответу.
Бхавин Туммар

58

Для тех, кому также нравится, как Джеффри Уэй использует Model::create()в своих учебных пособиях по Laracasts 5, где он просто отправляет запрос прямо в базу данных без явного задания каждого поля в контроллере и использования модели $fillableдля массового назначения (очень важно, для любого новичка и использующего таким образом): я читал много людей, использующих, insertGetId()но, к сожалению, это не относится $fillableк белому списку, так что вы получите ошибки при попытке вставить _token и все, что не является полем в базе данных, в конечном итоге настройте то, что вы хотите фильтр и т. д. Это меня обескуражило, потому что я хочу использовать массовое назначение и вообще писать меньше кода, когда это возможно. К счастью, createметод Eloquent просто оборачивает метод save (то, что упоминалось выше в @xdazz), так что вы все равно можете получить последний созданный идентификатор ...

public function store() {

    $input = Request::all();
    $id = Company::create($input)->id;

    return redirect('company/'.$id);
}

2
Этот пример не работал для меня в 5.1, но это $new = Company::create($input); return redirect('company/'.$new->id);
сработало

2
Это предполагает, что имена полей запроса совпадают с соответствующими столбцами базы данных. Что не всегда так (устаревшие коды, например) ..
Мосид

48

Если таблица имеет автоматически увеличивающийся идентификатор, используйте метод insertGetId, чтобы вставить запись, а затем получить идентификатор:

$id = DB::table('users')->insertGetId([
    'email' => 'john@example.com',
    'votes' => 0
]);

См. Https://laravel.com/docs/5.1/queries#inserts.


То, что вы описали, выглядит как захват последней вставки с использованием Fluent. Вопрос был о Eloquent. Это будет выглядеть так: $ id = Model :: create ('voice' => 0]) -> id; Как описано в этом ответе выше: stackoverflow.com/a/21084888/436443
Джеффз

46

**** Для Ларавела ****

Сначала создайте объект, затем установите значение атрибутов для этого объекта, затем сохраните запись объекта, а затем получите последний вставленный идентификатор. Такие как

$user = new User();        

$user->name = 'John';  

$user->save();

// Теперь получаем последний вставленный идентификатор

$insertedId = $user->id;

echo $insertedId ;

16

В 5 уровне: вы можете сделать это:

use App\Http\Requests\UserStoreRequest;
class UserController extends Controller {
    private $user;
    public function  __construct( User $user )
    {
        $this->user = $user;
    }
    public function store( UserStoreRequest $request )
    {
       $user= $this->user->create([
            'name'              => $request['name'],
            'email'             => $request['email'],
            'password'          => Hash::make($request['password'])
        ]);
        $lastInsertedId= $user->id;
    }
}

15

Вот пример:

public static function saveTutorial(){

    $data = Input::all();

    $Tut = new Tutorial;
    $Tut->title = $data['title'];
    $Tut->tutorial = $data['tutorial'];   
    $Tut->save();
    $LastInsertId = $Tut->id;

    return Response::json(array('success' => true,'last_id'=>$LastInsertId), 200);
}

15

Это сработало для меня в Laravel 4.2

$id = User::insertGetId([
    'username' => Input::get('username'),
    'password' => Hash::make('password'),
    'active'   => 0
]);

11

Вот как мы можем получить последний вставленный идентификатор в Laravel 4

public function store()
{
    $input = Input::all();

    $validation = Validator::make($input, user::$rules);

    if ($validation->passes())
    {

     $user= $this->user->create(array(
            'name'              => Input::get('name'),
            'email'             => Input::get('email'),
            'password'          => Hash::make(Input::get('password')),
        ));
        $lastInsertedId= $user->id; //get last inserted record's user id value
        $userId= array('user_id'=>$lastInsertedId); //put this value equal to datatable column name where it will be saved
        $user->update($userId); //update newly created record by storing the value of last inserted id
            return Redirect::route('users.index');
        }
    return Redirect::route('users.create')->withInput()->withErrors($validation)->with('message', 'There were validation errors.');
    }

11

Используйте insertGetIdдля вставки и вставкиid одновременно

Из документа

Если таблица имеет автоматически увеличивающийся идентификатор, используйте метод insertGetId, чтобы вставить запись, а затем получить идентификатор:

По Model

$id = Model::insertGetId(["name"=>"Niklesh","email"=>"myemail@gmail.com"]);

По DB

$id = DB::table('users')->insertGetId(["name"=>"Niklesh","email"=>"myemail@gmail.com"]);

Для получения более подробной информации: https://laravel.com/docs/5.5/queries#inserts


6

После сохранения модели инициализированный экземпляр имеет идентификатор:

$report = new Report();
$report->user_id = $request->user_id;
$report->patient_id = $request->patient_id;
$report->diseases_id = $request->modality;
$isReportCreated = $report->save();
return $report->id;  // this will return the saved report id

6

Для вставки ()

Пример:

$data1 = array(
         'company_id'    => $company_id,
         'branch_id'        => $branch_id
     );

$insert_id = CreditVoucher::insert($data1);
$id = DB::getPdo()->lastInsertId();
dd($id);

3

В Laravel 5.2 я бы сделал его максимально чистым:

public function saveContact(Request $request, Contact $contact)
{
   $create = $contact->create($request->all());
   return response()->json($create->id,  201);
}

3

После

$data->save()

$data->id даст вам вставленный идентификатор,

Примечание. Если ваш столбец автоинкремента имеет имя sno, вам следует использовать, $data->snoа не$data->id


2

После сохранения записи в базе данных, вы можете получить доступ к идентификатору по$data->id

return Response::json(['success' => true, 'last_insert_id' => $data->id], 200)

2

Для Laravel: если вы вставляете новую запись и вызываете $data->save()эту функцию, она выполняет запрос INSERT и возвращает значение первичного ключа (т.е. id по умолчанию).

Вы можете использовать следующий код:

if($data->save()) {
    return Response::json(array('status' => 1, 'primary_id'=>$data->id), 200);
}

2
$objPost = new Post;
$objPost->title = 'Title';
$objPost->description = 'Description';   
$objPost->save();
$recId = $objPost->id; // If Id in table column name if other then id then user the other column name

return Response::json(['success' => true,'id' => $recId], 200);


1

Для получения последнего вставленного идентификатора в базе данных вы можете использовать

$data = new YourModelName;
$data->name = 'Some Value';
$data->email = 'abc@mail.com';
$data->save();
$lastInsertedId = $data->id;

здесь $ lastInsertedId выдаст вам последний вставленный идентификатор автоинкремента.


1

Кратчайший путь - это вызов refresh()модели:

public function create(array $data): MyModel
{
    $myModel = new MyModel($dataArray);
    $myModel->saveOrFail();
    return $myModel->refresh();
}

1

Хотя этот вопрос немного устарел. Мое быстрое и грязное решение будет выглядеть так:

$last_entry = Model::latest()->first();

Но я думаю, что это уязвимо к гоночным условиям на часто посещаемых базах данных.


1
Спасибо! Это я мог бы использовать в моем конвейере. Так что не беспокойтесь об условиях гонки и прекрасном коде.
Daantje

1

Вы также можете попробовать вот так:

public function storeAndLastInrestedId() {
    $data = new ModelName();
    $data->title = $request->title;
    $data->save();

    $last_insert_id = $data->id;
    return $last_insert_id;
}

0

Использование Eloquent Model

$user = new Report();        
$user->email= 'johndoe@example.com';  
$user->save();
$lastId = $user->id;

Использование Query Builder

$lastId = DB::table('reports')->insertGetId(['email' => 'johndoe@example.com']);

0

После сохранения $data->save(). все данные помещаются внутрь $data. Так как это объект, и текущая строка была недавно сохранена внутри $data. так что последний insertIdбудет найден внутри $data->id.

Код ответа будет:

return Response::json(array('success' => true, 'last_insert_id' => $data->id), 200);


0

Вы можете получить последний вставленный идентификатор с тем же объектом, который вы вызываете методом сохранения;

$data->save();
$inserted_id = $data->id;

Так что вы можете просто написать:

if ($data->save()) {
    return Response::json(array('success' => true,'inserted_id'=>$data->id), 200);
}

0

Вы можете легко получить последний вставленный идентификатор записи

$user = User::create($userData);
$lastId = $user->value('id');

Это удивительный трюк, чтобы получить идентификатор из последней вставленной записи в БД.


два одновременно работающих пользователя добавляют модель компании одновременно. это не надежно, поскольку 1-е сообщение может получить идентификатор 2-го, если время выбрано правильно. принятый ответ надежен.
Алекс

@ Алекс, пожалуйста, проверьте, это работает и лучшее решение, чтобы получить последний вставленный идентификатор из записей.
Приянка Патель

обновленное решение прекрасно, но требует больше кода, чем принятый ответ. Простого выполнения $user->idдостаточно после создания, чтобы получить вставленный идентификатор.
Алекс

-1
public function store( UserStoreRequest $request ) {
    $input = $request->all();
    $user = User::create($input);
    $userId=$user->id 
}

2
На этот пост ответили 3 года назад. Пожалуйста, измените свой ответ, чтобы добавить больше объяснений относительно того, почему он может помочь пользователю или как он помогает решить вопрос ОП лучше.
Syfer

1
Спасибо за этот фрагмент кода, который может оказать некоторую немедленную помощь. Правильное объяснение значительно повысило бы его образовательную ценность, показав, почему это хорошее решение проблемы, и сделало бы его более полезным для будущих читателей с похожими, но не идентичными вопросами. Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение и указать, какие ограничения и предположения применяются. Не говоря уже о возрасте вопроса и низком качестве вашего ответа.
GrumpyCrouton

-1

Использование Eloquent Model

use App\Company;

public function saveDetailsCompany(Request $request)
{

$createcompany=Company::create(['nombre'=>$request->input('name'),'direccion'=>$request->input('address'),'telefono'=>$request->input('phone'),'email'=>$request->input('emaile'),'giro'=>$request->input('type')]);

// Last Inserted Row ID

echo $createcompany->id;

}

Использование Query Builder

$createcompany=DB::table('company')->create(['nombre'=>$request->input('name'),'direccion'=>$request->input('address'),'telefono'=>$request->input('phone'),'email'=>$request->input('emaile'),'giro'=>$request->input('type')]);

echo $createcompany->id;

Дополнительные методы получения идентификатора последней вставленной строки в Laravel: http://phpnotebook.com/95-laravel/127-3-methods-to-get-last-inserted-row-id-in-laravel


-1

Вы можете использовать $thisпеременную конструктора для получения «последнего вставленного идентификатора с использованием Laravel Eloquent» (без добавления дополнительного столбца) в текущей функции или контроллере.

public function store(Request $request){
    $request->validate([
        'title' => 'required|max:255',
        'desc' => 'required|max:5000'
    ]);

    $this->project = Project::create([
        'name' => $request->title,
        'description' => $request->desc,
    ]);

    dd($this->project->id);  //This is your current/latest project id
    $request->session()->flash('project_added','Project added successfully.');
    return redirect()->back();

}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.