ChatGPT解决这个技术问题 Extra ChatGPT

Get the Last Inserted Id Using Laravel Eloquent

I'm currently using the below code to insert data in a table:

<?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);
    }
}

I want to return the last ID inserted but I don't know how to get it.

Kind regards!

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

v
vimuth

After save, $data->id should be the last id inserted.

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

Can be used like this.

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

For updated laravel version try this

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

An object always returns an object, ofc. This is the only way to go.
Beware that if the id is NOT autoincrement, this will always return 0. In my case the id was a string (UUID) and for this to work I had to add public $incrementing = false; in my model.
@milz I have MySQL trigger that generate the uuid for a custom field named aid and I have set $incrementing = false; but It does not returned too!
@SaidbakR while true, please can you indicate the section of the Laravel doc where you got this very important information?
@DamilolaOlowookere This is what I had found in my application which uses Laravel 5.4.
C
Community

xdazz is right in this case, but for the benefit of future visitors who might be using DB::statement or DB::insert, there is another way:

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

Actually you can do it right in the insert $id = DB::table('someTable')->insertGetId( ['field' => Input['data']);
@Casey doing it this way will not update timestamps in the DB
@Rafael, if you want to update timestamps using insertGetId, kindly check here
Exactly what I was looking for the other day! Also, insertGetId only works if the id columns is actually called "id".
@Benubird, I have got my solution according your answer.
B
Barry

If the table has an auto-incrementing id, use the insertGetId method to insert a record and then retrieve the ID:

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

Refer: https://laravel.com/docs/5.1/queries#inserts


What you described looks like capturing last insert using Fluent. Question was about Eloquent. It would look more like: $id = Model::create('votes' => 0])->id; As described in this answer above: stackoverflow.com/a/21084888/436443
And of course, as mentioned in other comments, don't forget that using insert will ignore events and $fillable, so take that into consideration!
d
dave

For anyone who also likes how Jeffrey Way uses Model::create() in his Laracasts 5 tutorials, where he just sends the Request straight into the database without explicitly setting each field in the controller, and using the model's $fillable for mass assignment (very important, for anyone new and using this way): I read a lot of people using insertGetId() but unfortunately this does not respect the $fillable whitelist so you'll get errors with it trying to insert _token and anything that isn't a field in the database, end up setting things you want to filter, etc. That bummed me out, because I want to use mass assignment and overall write less code when possible. Fortunately Eloquent's create method just wraps the save method (what @xdazz cited above), so you can still pull the last created ID...

public function store() {

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

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

This example didn't work for me in 5.1, but this did: $new = Company::create($input); return redirect('company/'.$new->id);
This assumes that the request fields name are the same as their respective database columns. Which is not always the case ( legacy codes for example)..
M
Majbah Habib

**** For Laravel ****

Firstly create an object, Then set attributes value for that object, Then save the object record, and then get the last inserted id. such as

$user = new User();        

$user->name = 'John';  

$user->save();

// Now Getting The Last inserted id

$insertedId = $user->id;

echo $insertedId ;

A
Abdulhakim Zeinu

There are several ways to get the last inserted id. All are based on what method do you used when inserting. In your case you can get last Id like the following:

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

For others who need to know how can they get last inserted id if they use other insert methods here is how:

Using create() method $book = Book::create(['name'=>'Laravel Warrior']); $lastId = $book->id;

Using insertGetId() $id = DB::table('books')->insertGetId( ['name' => 'Laravel warrior'] ); $lastId = $id;

Using lastInsertId() method $lastId = DB::getPdo()->lastInsertId();

Reference https://easycodesolution.com/2020/08/22/last-inserted-id-in-laravel/


M
Mujibur

In laravel 5: you can do this:

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;
    }
}

B
Barry

This worked for me in laravel 4.2

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

B
Barry

Here's an example:

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

N
Niklesh Raut

Use insertGetId to insert and get inserted id at the same time

From doc

If the table has an auto-incrementing id, use the insertGetId method to insert a record and then retrieve the ID:

By Model

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

By DB

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

For more details : https://laravel.com/docs/5.5/queries#inserts


Q
Qamar Uzman

Here is how we can get last inserted id in 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.');
    }

J
JON

For insert()

Example:

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

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

didn't know about this lastInsertId(). thanks man
d
dustypaws

Although this question is a bit dated. My quick and dirty solution would look like this:

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

But I guess it's vulnerable to race conditions on highly frequented databases.


Thanks! This I could use in my pipeline. So no worries about race conditions and beautiful code.
B
Barry

After saving model, the initialized instance has the id:

$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

A
Abhishek Goel

After

$data->save()

$data->id will give you the inserted id,

Note: If your autoincrement column name is sno then you should use $data->sno and not $data->id


P
Priyanka Patel

You can easily fetch last inserted record Id

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

It's an awesome trick to fetch Id from the last inserted record in the DB.


two concurrent users adding the to the company model at the same time. this isn't reliable as the 1st post might get the id of the 2nd if the timing is right. the accepted answer is reliable.
@Alex kindly check, this is working and the best solution to get last inserted id from records.
the updated solution is fine, however it requires more code than the accepted answer. Simply doing $user->id is enough after creating to get the inserted id.
T
Tayyab Hussain

After saving a record in database, you can access id by $data->id

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

b
bobbybackblech

In Laravel 5.2 i would make it as clean as possible:

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

S
Sᴀᴍ Onᴇᴌᴀ

For Laravel, If you insert a new record and call $data->save() this function executes an INSERT query and returns the primary key value (i.e. id by default).

You can use following code:

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

m
moodymudskipper

You can do this:

$result=app('db')->insert("INSERT INTO table...");

$lastInsertId=app('db')->getPdo()->lastInsertId();

B
Barry
$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);

P
PPL

For get last inserted id in database You can use

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

here $lastInsertedId will gives you last inserted auto increment id.


a
automatix

The shortest way is probably a call of the refresh() on the model:

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

v
ventaquil

You can also try like this:

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

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

s
surajav

Here it is how it worked for me, family_id is the primary key with auto increment I am using Laravel7

    public function store(Request $request){
        $family = new Family();
        $family->family_name = $request->get('FamilyName');
        $family->family_no = $request->get('FamilyNo');
        $family->save();
        //family_id is the primary key and auto increment
        return redirect('/family/detail/' .  $family->family_id);
    }

Also in the Model Family file which extends Model, should have the increment set to true otherwise the above $family-->family_id will return empty

    public $incrementing = true;
  

M
Md. Saidur Rahman Milon

Using Eloquent Model

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

Using Query Builder

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

B
Barry

After Saving $data->save(). all data is pushed inside $data. As this is an object and the current row is just saved recently inside $data. so last insertId will be found inside $data->id.

Response code will be:

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

i
infomasud

You can get last inserted id with same object you call save method;

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

So you can simply write:

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

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

This post was answered 3 years ago. Please edit your answer to add more explanation as to why it might help the user or how its helps solves the OP's question in a better way.
Thank you for this code snippet, which may provide some immediate help. A proper explanation would greatly improve its educational value by showing why this is a good solution to the problem, and would make it more useful to future readers with similar, but not identical, questions. Please edit your answer to add explanation, and give an indication of what limitations and assumptions apply. Not to mention the age of the question and the low quality of your answer.
Beware of using this code as there is no validation here. You should not store any information without validation.
K
Karthik

Using 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;

}

Using 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;

For more methods to get Last Inserted Row id in Laravel : http://phpnotebook.com/95-laravel/127-3-methods-to-get-last-inserted-row-id-in-laravel