Dapatkan Id Terakhir Dimasukkan Menggunakan Laravel Eloquent


294

Saat ini saya menggunakan kode di bawah ini untuk memasukkan data dalam tabel:

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

Saya ingin mengembalikan ID terakhir yang dimasukkan tetapi saya tidak tahu bagaimana cara mendapatkannya.

Salam!

Jawaban:


378

Setelah menyimpan , $data->idseharusnya id terakhir dimasukkan.

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

Bisa digunakan seperti ini.

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

Untuk versi laravel yang diperbarui, coba ini

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

2
Objek selalu mengembalikan objek, ofc. Ini satu-satunya cara untuk pergi.
Cas Bloem

40
Hati-hati bahwa jika id BUKAN autoincrement, ini akan selalu kembali 0. Dalam kasus saya id adalah string (UUID) dan agar ini berfungsi saya harus menambahkan public $incrementing = false;model saya.
Luís Cruz

2
@milz Saya memiliki pemicu MySQL yang menghasilkan uuid untuk bidang kustom bernama aiddan saya telah mengatur $incrementing = false;tetapi tidak kembali juga!
SaidbakR

@SaidbakR sementara benar, bisakah Anda menunjukkan bagian dokumen Laravel di mana Anda mendapatkan informasi yang sangat penting ini?
Damilola Olowookere

@DamilolaOlowookere Ini adalah apa yang saya temukan di aplikasi saya yang menggunakan Laravel 5.4.
SaidbakR

121

xdazz benar dalam hal ini, tetapi untuk kepentingan pengunjung masa depan yang mungkin menggunakan DB::statementatau DB::insert, ada cara lain:

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

43
Sebenarnya Anda bisa melakukannya dengan benar di sisipan$id = DB::table('someTable')->insertGetId( ['field' => Input['data']);
Casey

1
@Casey melakukannya dengan cara ini tidak akan memperbarui stempel waktu di DB
Rafael

@ Rafael, jika Anda ingin memperbarui timestampsmenggunakan insertGetId, silakan cek di sini
Frank Myat Thu

Persis seperti yang saya cari kemarin! Juga, insertGetIdhanya berfungsi jika kolom id sebenarnya disebut "id".
Kapten Hypertext

@ Benubird, saya sudah mendapat solusi sesuai jawaban Anda.
Bhavin Thummar

58

Bagi siapa pun yang juga menyukai cara Jeffrey Way menggunakan Model::create()dalam tutorial Laracasts 5-nya, di mana ia hanya mengirim Permintaan langsung ke dalam basis data tanpa secara eksplisit mengatur setiap bidang dalam pengontrol, dan menggunakan model $fillableuntuk tugas massal (sangat penting, bagi siapa pun yang baru dan menggunakan begini): Saya membaca banyak orang menggunakan insertGetId()tetapi sayangnya ini tidak menghormati $fillabledaftar putih sehingga Anda akan mendapatkan kesalahan dengan mencoba memasukkan _token dan apa pun yang bukan bidang dalam database, akhirnya mengatur hal-hal yang ingin Anda filter, dll. Itu membuat saya kesal, karena saya ingin menggunakan penugasan massal dan secara keseluruhan menulis lebih sedikit kode bila memungkinkan. Untungnya createmetode Eloquent hanya membungkus metode penyimpanan (apa yang disebutkan oleh @xdazz di atas), sehingga Anda masih dapat menarik ID yang terakhir dibuat ...

public function store() {

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

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

2
Contoh ini tidak berfungsi untuk saya di 5.1, tetapi ini berhasil:$new = Company::create($input); return redirect('company/'.$new->id);
timgavin

2
Ini mengasumsikan bahwa nama bidang permintaan sama dengan kolom basis data masing-masing. Yang tidak selalu terjadi (misalnya kode warisan) ..
mosid

48

Jika tabel memiliki id penambahan otomatis, gunakan metode insertGetId untuk menyisipkan catatan dan kemudian ambil ID:

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

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


Apa yang Anda gambarkan tampak seperti menangkap insert terakhir menggunakan Fluent. Pertanyaannya adalah tentang Eloquent. Akan terlihat lebih seperti: $ id = Model :: create ('votes' => 0]) -> id; Seperti dijelaskan dalam jawaban di atas: stackoverflow.com/a/21084888/436443
Jeffz

46

**** Untuk Laravel ****

Pertama-tama buat objek, Kemudian atur nilai atribut untuk objek itu, Lalu simpan catatan objek, dan kemudian dapatkan id yang disisipkan terakhir. seperti

$user = new User();        

$user->name = 'John';  

$user->save();

// Sekarang Mendapatkan id yang Terakhir Disisipkan

$insertedId = $user->id;

echo $insertedId ;

16

Di laravel 5: Anda bisa melakukan ini:

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

Ini sebuah contoh:

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

Ini bekerja untuk saya di laravel 4.2

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

11

Berikut ini cara mendapatkan id yang dimasukkan terakhir di 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

Gunakan insertGetIduntuk memasukkan dan dimasukkan idpada saat yang sama

Dari dok

Jika tabel memiliki id penambahan otomatis, gunakan metode insertGetId untuk menyisipkan catatan dan kemudian ambil ID:

Oleh Model

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

Oleh DB

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

Untuk detail lebih lanjut: https://laravel.com/docs/5.5/queries#inserts


6

Setelah menyimpan model, instance yang diinisialisasi memiliki 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

Untuk memasukkan ()

Contoh:

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

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

3

Dalam Laravel 5.2 saya akan membuatnya sebersih mungkin:

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

3

Setelah

$data->save()

$data->id akan memberi Anda id yang dimasukkan,

Catatan: Jika nama kolom autoincrement Anda adalah sno maka Anda harus menggunakan $data->snodan tidak$data->id


2

Setelah menyimpan catatan dalam basis data, Anda dapat mengakses id dengan$data->id

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

2

Untuk Laravel, Jika Anda memasukkan catatan baru dan memanggil $data->save()fungsi ini, jalankan permintaan INSERT dan kembalikan nilai kunci utama (mis. Id secara default).

Anda dapat menggunakan kode berikut:

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

Kamu bisa melakukan ini:

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

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

1

Untuk mendapatkan id yang dimasukkan terakhir dalam database, Anda dapat menggunakan

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

di sini $ lastInsertedId akan memberi Anda id kenaikan otomatis yang dimasukkan terakhir.


1

Cara terpendek mungkin adalah panggilan refresh()pada model:

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

1

Meskipun pertanyaan ini agak tanggal. Solusi cepat dan kotor saya akan terlihat seperti ini:

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

Tapi saya kira itu rentan terhadap kondisi balapan pada database yang sangat sering dikunjungi.


1
Terima kasih! Ini bisa saya gunakan dalam pipa saya. Jadi jangan khawatir tentang kondisi balapan dan kode yang indah.
Daantje

1

Anda juga dapat mencoba seperti ini:

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

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

0

Menggunakan Model Eloquent

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

Menggunakan Pembuat Kueri

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

0

Setelah Menyimpan $data->save(). semua data didorong masuk $data. Karena ini adalah objek dan baris saat ini baru saja disimpan di dalam $data. jadi yang terakhir insertIdakan ditemukan di dalam $data->id.

Kode respons akan:

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


0

Anda bisa mendapatkan id yang dimasukkan terakhir dengan objek yang sama dengan yang Anda sebut metode simpan;

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

Jadi Anda cukup menulis:

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

0

Anda dapat dengan mudah mengambil Id rekaman yang dimasukkan terakhir

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

Ini adalah trik yang luar biasa untuk mengambil Id dari catatan yang dimasukkan terakhir di DB.


dua pengguna bersamaan menambahkan ke model perusahaan pada saat yang sama. ini tidak dapat diandalkan karena posting pertama mungkin mendapatkan id ke-2 jika waktunya tepat. jawaban yang diterima dapat diandalkan.
Alex

@Alex silakan periksa, ini berfungsi dan solusi terbaik untuk mendapatkan id yang dimasukkan terakhir dari catatan.
Priyanka Patel

solusi yang diperbarui baik-baik saja, namun membutuhkan lebih banyak kode daripada jawaban yang diterima. Cukup melakukan $user->idcukup setelah membuat untuk mendapatkan id yang dimasukkan.
Alex

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

2
Posting ini dijawab 3 tahun yang lalu. Harap edit jawaban Anda untuk menambahkan lebih banyak penjelasan mengapa itu dapat membantu pengguna atau bagaimana bantuannya memecahkan pertanyaan OP dengan cara yang lebih baik.
Syfer

1
Terima kasih atas cuplikan kode ini, yang dapat memberikan bantuan segera. Penjelasan yang tepat akan sangat meningkatkan nilai pendidikannya dengan menunjukkan mengapa ini adalah solusi yang baik untuk masalah ini, dan akan membuatnya lebih bermanfaat bagi pembaca masa depan dengan pertanyaan yang serupa, tetapi tidak sama. Harap edit jawaban Anda untuk menambahkan penjelasan, dan berikan indikasi batasan dan asumsi apa yang berlaku. Belum lagi usia pertanyaan dan rendahnya kualitas jawaban Anda.
GrumpyCrouton

-1

Menggunakan Model 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;

}

Menggunakan Pembuat Kueri

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

Untuk metode lainnya untuk mendapatkan id Baris Terakhir Dimasukkan di Laravel: http://phpnotebook.com/95-laravel/127-3-methods-to-get-last-inserted-row-id-in-laravel


-1

Anda dapat menggunakan $thisvariabel konstruktor untuk mencapai "Id Terakhir Dimasukkan Menggunakan Laravel Eloquent" (tanpa menambahkan kolom tambahan) dalam fungsi atau pengontrol saat ini.

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

}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.