【问题标题】:Get the Last Inserted Id Using Laravel Eloquent使用 Laravel Eloquent 获取最后插入的 ID
【发布时间】:2014-01-31 19:37:36
【问题描述】:

我目前正在使用以下代码在表格中插入数据:

<?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,但我不知道如何获取它。

亲切的问候!

【问题讨论】:

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

标签: php database laravel eloquent


【解决方案1】:

保存之后,$data-&gt;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);

【讨论】:

  • 一个对象总是返回一个对象,ofc。这是唯一的出路。
  • 请注意,如果 id 不是自动递增的,这将始终返回 0。在我的例子中,id 是一个字符串 (UUID),为此我必须在我的模型中添加 public $incrementing = false;
  • @milz 我有 MySQL 触发器,它为名为 aid 的自定义字段生成 uuid,我已经设置了 $incrementing = false;,但它也没有返回!
  • @SaidbakR 虽然是真的,但请您指出您获得此非常重要信息的 Laravel 文档部分吗?
  • @DamilolaOlowookere 这是我在使用 Laravel 5.4 的应用程序中发现的。
【解决方案2】:

这是一个例子:

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

【讨论】:

    【解决方案3】:

    xdazz 在这种情况下是正确的,但是为了将来可能使用DB::statementDB::insert 的访问者的利益,还有另一种方法:

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

    【讨论】:

    • 其实你可以直接在插入$id = DB::table('someTable')-&gt;insertGetId( ['field' =&gt; Input['data']);
    • @Casey 这样做不会更新数据库中的时间戳
    • @Rafael,如果您想使用insertGetId 更新timestamps,请查看here
    • 正是我前几天在寻找的东西!此外,insertGetId 仅在 id 列实际上称为“id”时才有效。
    • @Benubird,我根据你的回答得到了解决方案。
    【解决方案4】:

    这是我们如何在 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.');
        }
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        这在 laravel 4.2 中对我有用

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

        【讨论】:

          【解决方案7】:

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

          public function store() {
          
              $input = Request::all();
              $id = Company::create($input)->id;
          
              return redirect('company/'.$id);
          }
          

          【讨论】:

          • 这个例子在 5.1 中对我不起作用,但确实如此:$new = Company::create($input);return redirect('company/'.$new-&gt;id);
          • 这假定请求字段名称与其各自的数据库列相同。情况并非总是如此(例如遗留代码)..
          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

            保存记录到数据库后,您可以通过$data-&gt;id访问id

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

            【讨论】:

              【解决方案10】:

              在 Laravel 5.2 中,我会使其尽可能干净:

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

              【讨论】:

                【解决方案11】:

                **** 对于 Laravel ****

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

                $user = new User();        
                
                $user->name = 'John';  
                
                $user->save();
                

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

                $insertedId = $user->id;
                
                echo $insertedId ;
                

                【讨论】:

                  【解决方案12】:

                  如果表有自增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
                  • 当然,正如其他 cmets 中提到的,不要忘记使用 insert 会忽略事件和 $fillable,所以要考虑到这一点!
                  【解决方案13】:

                  对于 Laravel,如果您插入新记录并调用 $data-&gt;save(),此函数将执行 INSERT 查询并返回主键值(即默认情况下为 id)。

                  您可以使用以下代码:

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

                  【讨论】:

                    【解决方案14】:

                    之后

                    $data->save()
                    

                    $data-&gt;id 会给你插入的 id,

                    注意:如果您的自动增量列名称是 sno,那么您应该使用 $data-&gt;sno 而不是 $data-&gt;id

                    【讨论】:

                      【解决方案15】:

                      保存$data-&gt;save() 后。所有数据都被推入$data。因为这是一个对象,并且当前行最近才保存在 $data 中。所以最后一个insertId 将在$data-&gt;id 中找到。

                      响应代码将是:

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

                      【讨论】:

                        【解决方案16】:

                        你可以这样做:

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

                        【讨论】:

                          【解决方案17】:
                          public function store( UserStoreRequest $request ) {
                              $input = $request->all();
                              $user = User::create($input);
                              $userId=$user->id 
                          }
                          

                          【讨论】:

                          • 这篇文章是 3 年前回答的。请编辑您的答案以添加更多解释,说明为什么它可能会帮助用户或它如何帮助以更好的方式解决 OP 的问题。
                          • 感谢您提供此代码 sn-p,它可能会提供一些即时帮助。正确解释would greatly improve 其教育价值,说明为什么这是一个很好的问题解决方案,并将使其对未来有类似但不相同问题的读者更有用。请编辑您的答案以添加解释,并说明适用的限制和假设。更不用说问题的年龄和答案的低质量了。
                          • 谨防使用此代码,因为这里没有验证。未经验证,您不应存储任何信息。
                          【解决方案18】:

                          使用insertGetId同时插入和被插入id

                          来自doc

                          如果表有自增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

                          【讨论】:

                            【解决方案19】:

                            使用 Eloquent 模型

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

                            使用查询生成器

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

                            【讨论】:

                              【解决方案20】:

                              获取数据库中最后插入的 id 你可以使用

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

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

                              【讨论】:

                                【解决方案21】:
                                $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);
                                

                                【讨论】:

                                  【解决方案22】:

                                  使用 Eloquent 模型

                                  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 中获取 Last Inserted Row id 的更多方法:http://phpnotebook.com/95-laravel/127-3-methods-to-get-last-inserted-row-id-in-laravel

                                  【讨论】:

                                    【解决方案23】:

                                    对于插入()

                                    例子:

                                    $data1 = array(
                                             'company_id'    => $company_id,
                                             'branch_id'        => $branch_id
                                         );
                                    
                                    $insert_id = CreditVoucher::insert($data1);
                                    $id = DB::getPdo()->lastInsertId();
                                    dd($id);
                                    

                                    【讨论】:

                                    • 不知道这个 lastInsertId()。谢谢人
                                    【解决方案24】:

                                    最短的方法可能是在模型上调用refresh()

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

                                    【讨论】:

                                      【解决方案25】:

                                      虽然这个问题有点过时了。我的快速而肮脏的解决方案如下所示:

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

                                      但我猜它很容易受到频繁使用的数据库上的竞争条件的影响。

                                      【讨论】:

                                      • 谢谢!我可以在我的管道中使用它。所以不用担心竞争条件和漂亮的代码。
                                      【解决方案26】:

                                      可选方法是:

                                      $lastID = DB::table('EXAMPLE-TABLE')
                                                      ->orderBy('id', 'desc')
                                                      ->first();
                                      
                                      $lastId = $lastProduct->id;
                                      
                                      

                                      Source from Laravel 5.8 version

                                      【讨论】:

                                        【解决方案27】:

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

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

                                        所以你可以简单地写:

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

                                        【讨论】:

                                          【解决方案28】:

                                          您可以在当前函数或控制器中使用$this 构造函数变量来实现“Last Inserted Id Using 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();
                                          
                                          }
                                          

                                          【讨论】:

                                            【解决方案29】:

                                            你也可以这样试试:

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

                                            【讨论】:

                                              【解决方案30】:

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

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

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

                                              【讨论】:

                                              • 两个并发用户同时添加到公司模型。这是不可靠的,因为如果时机合适,第 1 篇文章可能会获得第 2 篇文章的 id。接受的答案是可靠的。
                                              • @Alex 请检查一下,这是有效的,也是从记录中获取最后插入的 id 的最佳解决方案。
                                              • 更新后的解决方案很好,但是它需要比接受的答案更多的代码。创建后只需执行$user-&gt;id 即可获取插入的ID。
                                              猜你喜欢
                                              • 2016-08-15
                                              • 2019-05-27
                                              • 2015-03-08
                                              • 2018-04-06
                                              • 2021-10-22
                                              • 2016-12-19
                                              • 2015-09-13
                                              相关资源
                                              最近更新 更多