使用Laravel Eloquent获取最后插入的ID


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

我想返回插入的最后一个ID,但我不知道如何获取它。

亲切的问候!

Answers:


378

保存$data->id应该是最后的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
请注意,如果ID不是自动递增,则将始终返回0。在我的情况下,id是一个字符串(UUID),为此,我必须public $incrementing = false;在模型中添加它。
路易斯·克鲁兹

2
@milz我有MySQL触发器,该触发器为名为的自定义字段生成uuid,aid并且已设置,$incrementing = false;但也未返回!
SaidbakR

@SaidbakR为真,请您指出在Laravel文档中获得此重要信息的部分吗?
Damilola Olowookere,

@DamilolaOlowookere这是我在使用Laravel 5.4的应用程序中发现的内容。
SaidbakR

121

在这种情况下,xdazz是正确的,但是对于可能使用DB::statement或的未来访问者来说DB::insert,还有另一种方法:

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

43
实际上,您可以在插入内容中直接进行编辑$id = DB::table('someTable')->insertGetId( ['field' => Input['data']);
Casey 2014年

1
@Casey这样做不会更新数据库中的时间戳
Rafael

@Rafael,如果你想更新timestamps使用insertGetId,请查看这里
弗兰克妙周四

正是我前几天要寻找的东西!同样,insertGetId仅在id列实际称为“ id”的情况下有效。
Captain Hypertext

@Benubird,根据您的回答,我已经找到了解决方案。
Bhavin Thummar,

57

对于也喜欢Jeffrey Way Model::create()在Laracasts 5教程中的用法的任何人,他只需将Request直接发送到数据库中,而无需显式设置控制器中的每个字段,而是使用模型$fillable进行大量分配(非常重要,对于新手和新手,这样):我读过很多人在使用,insertGetId()但不幸的是,这不尊重$fillable白名单,因此尝试插入_token和数据库中非字段的任何内容都会出错,最终会设置您想要的内容过滤器等。这让我感到很沮丧,因为我想使用批量分配,并在可能的情况下总体上减少编写代码。幸运的是,Eloquent的create方法只是包装了save方法(上面引用了@xdazz),因此您仍然可以提取最后创建的ID ...

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
假设请求字段名称与其各自的数据库列相同。情况并非总是如此(例如,传统代码)
。– mosid

48

如果表具有自动递增的ID,请使用insertGetId方法插入一条记录,然后检索该ID:

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

请参阅:https//laravel.com/docs/5.1/queries#inserts


您所描述的内容看起来像是使用Fluent捕获最后一个插入内容。问题是关于口才。它看起来更像是:$ id = Model :: create('votes'=> 0])-> id; 如以上答案所述:stackoverflow.com/a/21084888/436443
Jeffz

46

****对于Laravel ****

首先创建一个对象,然后为该对象设置属性值,然后保存对象记录,然后获取最后插入的ID。如

$user = new User();        

$user->name = 'John';  

$user->save();

//现在获取最后插入的ID

$insertedId = $user->id;

echo $insertedId ;

16

在laravel 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中最后插入的ID

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在同一时间

来自文件

如果表具有自动递增的ID,请使用insertGetId方法插入一条记录,然后检索该ID:

通过 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

保存模型后,初始化的实例具有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

6

对于 insert()

例:

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


2

保存在数据库中的记录,您可以访问ID通过$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

你可以这样做:

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

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

1

要获取数据库中最后插入的ID,可以使用

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

这里$ lastInsertedId将为您提供最后插入的自动增量ID。


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

使用口才模型

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

使用查询生成器

$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

您可以使用调用save方法的同一对象获取最后插入的ID;

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

所以你可以简单地写:

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

0

您可以轻松获取最后插入的记录ID

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

从数据库中最后插入的记录中获取ID是一个很棒的技巧。


同时将两个并发用户添加到公司模型中。这是不可靠的,因为如果时机正确,第一条帖子可能会获得第二条的ID。接受的答案是可靠的。
亚历克斯

@Alex请检查,这是有效的,并且是从记录中获取最后插入的ID的最佳解决方案。
Priyanka Patel

更新的解决方案很好,但是它需要比接受的答案更多的代码。$user->id创建获取插入的ID之后,只需做即可。
Alex

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

2
这篇文章是3年前回答的。请编辑您的答案以添加更多解释,说明为什么它可能会帮助用户或它如何以更好的方式解决OP的问题。
Syfer

1
感谢您提供此代码段,它可能会立即提供帮助。通过说明为什么这是一个解决问题的好方法,正确的解释将大大提高其教育价值,并且对将来有相似但不相同的问题的读者来说更有用。请编辑您的答案以添加说明,并指出适用的限制和假设。更不用说问题的年龄和答案的质量低下了。
GrumpyCrouton

-1

使用口才模型

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;

}

使用查询生成器

$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中获取最后插入行ID的更多方法,请参见:http ://phpnotebook.com/95-laravel/127-3-methods-to-get-last-inserted-row-id-in-laravel


-1

您可以使用$this构造函数变量在当前函数或控制器中实现“使用Laravel Eloquent的最后插入ID”(不添加任何额外的列)。

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

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.