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

时间:2014-01-13 06:02:24

标签: php database laravel eloquent

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

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

亲切的问候!

33 个答案:

答案 0 :(得分:315)

save之后,$data->id应该是最后插入的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);

答案 1 :(得分:99)

在这种情况下,

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

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

答案 2 :(得分:50)

对于那些也喜欢Jeffrey Way在他的Laracasts 5教程中使用Model::create()的人来说,他只需将请求直接发送到数据库而无需在控制器中明确设置每个字段,并使用模型&#39; s $fillable用于群发作业(非常重要,对于任何新用户和使用此方式):我使用insertGetId()阅读了很多人,但不幸的是,这不尊重$fillable白名单,所以你&#39 ;它会在尝试插入_token和数据库中没有任何字段的情况下出现错误,最终设置要过滤的内容等等。这让我感到很沮丧,因为我想使用质量分配和整体写入更少代码尽可能。幸运的是,Eloquent的create method只包含了save方法(上面引用的@xdazz),所以你仍然可以提取最后创建的ID ...

public function store() {

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

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

答案 3 :(得分:36)

****对于Laravel ****

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

$user = new User();        

$user->name = 'John';  

$user->save();

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

$insertedId = $user->id;

echo $insertedId ;

答案 4 :(得分:36)

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

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

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

答案 5 :(得分:15)

在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 :(得分:12)

这在laravel 4.2中对我有用。

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

答案 7 :(得分:11)

以下是一个例子:

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

答案 8 :(得分:9)

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

答案 9 :(得分:8)

使用 if (!empty($save['samp_id'])){ $this->db->insert('tblsavesection', $save); } } 同时插入并插入insertGetId

来自doc

  

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

id

Model

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

DB

有关详情:https://laravel.com/docs/5.5/queries#inserts

答案 10 :(得分:4)

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

答案 11 :(得分:2)

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

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

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

答案 12 :(得分:2)

对于insert()

Example:
  

$ data1 =数组(               'company_id'=> $ company_id,               'branch_id'=> $ branch_id           );

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

答案 13 :(得分:2)

有几种获取最后插入的ID的方法。全部取决于您在插入时使用的方法。根据您的情况,您可以像以下这样获得最后一个ID:

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

对于其他人,如果他们使用其他插入方法,则需要知道如何获得上一个插入的ID,方法如下:

  • 使用create()方法

    $book = Book::create(['name'=>'Laravel Warrior']);

    $lastId = $book->id;

  • 使用insertGetId()

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

  • 使用lastInsertId()方法

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

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

答案 14 :(得分: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);

答案 15 :(得分:2)

$data->save()

$data->id将为您提供插入的ID

注意:如果您的自动增量列名称为 sno ,那么您应该使用 $data->sno而非$data->id

答案 16 :(得分:2)

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

您可以使用以下代码:

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

答案 17 :(得分:2)

在Laravel 5.2中,我会尽可能保持清洁:

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

答案 18 :(得分:2)

保存数据库中的记录后,您可以$data->id

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

答案 19 :(得分:1)

你可以这样做:

Route::get('/', 'HomeController@index')->name('dashboard');

Route::post('addbusiness', 
  ['as' => 'addbusiness', 'uses' => 'PostsController@insert']);

答案 20 :(得分:1)

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

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

答案 21 :(得分:0)

保存$data->save()后。所有数据都在$data内推送。由于这是一个对象,因此最近在$data内保存了当前行。所以最后insertId会在$data->id内找到。

响应代码为:

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

答案 22 :(得分:0)

使用Eloquent模型

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

使用查询生成器

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

答案 23 :(得分:0)

用于获取数据库中的最后一个插入ID 你可以使用

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

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

答案 24 :(得分:0)

尽管这个问题有些陈旧。我快速又肮脏的解决方案如下所示:

Public Class LoginForm
    Private Retrys As Integer 'Integers automatically initialize to zero

    Private Sub Ok_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Ok.Click
        If Retrys = 2 Then
            MessageBox.Show("Sorry, you have exceeded the maximum number of attempts to login")
            Close()
        End If

        Dim AppLogin As New ApplicatioLogin
        'Do your validation here; not in the Data Access code.
        If Not String.IsNullOrWhiteSpace(un.Text) AndAlso Not String.IsNullOrWhiteSpace(pw.Text) Then
            If AppLogin.Login(un.Text, pw.Text) Then
                SensitiveDataForm.Load()
                Close()
            Else
                Retrys += 1
                MessageBox.Show("Login Failed")
            End If
        Else
            MessageBox.Show("Please fill in both username and password")
        End If
    End Sub
End Class
Public Class ApplicatioLogin
        Public Function Login(UserName As String, UserPassword As String) As Boolean
            Dim recordCount As Integer
            Using cn As New OleDb.OleDbConnection("Your connection string")
                Using cmd As New OleDb.OleDbCommand("SELECT Count(*) FROM Users 
                    WHERE UserName = @UserName AND UserPassword = @UserPassword", cn)
                    cmd.Parameters.Add("@UserName", OleDbType.VarChar).Value = UserName
                    cmd.Parameters.Add("@UserPassword", OleDbType.VarChar).Value = UserPassword
                    cn.Open()
                    recordCount = CInt(cmd.ExecuteScalar)
                End Using
            End Using
            If recordCount = 1 Then
                Return True
            Else
                Return False
            End If
        End Function
End Class

但是我想它很容易受到频繁访问的数据库上竞争条件的影响。

答案 25 :(得分:0)

可选方法将是:

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

$lastId = $lastProduct->id;

Source from Laravel 5.8 version

答案 26 :(得分:0)

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

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

所以您可以简单地写:

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

答案 27 :(得分:0)

这是对我有用的方法,family_id是我正在使用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);
    }

还在扩展模型的模型族文件中,应将增量设置为true,否则上述$ family-> family_id将返回空

    public $incrementing = true;
  

答案 28 :(得分:0)

您也可以这样尝试:

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

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

答案 29 :(得分:-1)

要获取 Laravel 中的最后一个数据,您可以在查询中使用 first() 方法。

使用 Eloquent:

$company = Company::orderBy('id', 'DESC')->first();

使用查询:

$company = DB::table('company')->where('id', 'DESC')->first();

答案 30 :(得分:-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();

}

答案 31 :(得分:-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

答案 32 :(得分:-1)

// 1) **