Nhận Id được chèn lần cuối bằng cách sử dụng Laravel Eloquent


294

Tôi hiện đang sử dụng mã dưới đây để chèn dữ liệu vào bảng:

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

Tôi muốn trả lại ID cuối cùng được chèn nhưng tôi không biết cách lấy.

Trân trọng!

Câu trả lời:


378

Sau khi lưu , $data->idnên chèn id cuối cùng.

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

Có thể được sử dụng như thế này.

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

Để cập nhật phiên bản laravel, hãy thử điều này

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

2
Một đối tượng luôn trả về một đối tượng, ofc. Đây là cách duy nhất để đi.
Cas Bloem

40
Xin lưu ý rằng nếu id KHÔNG tự động, điều này sẽ luôn trở lại 0. Trong trường hợp của tôi, id là một chuỗi (UUID) và để nó hoạt động, tôi phải thêm public $incrementing = false;vào mô hình của mình.
Luís Cruz

2
@milz Tôi có trình kích hoạt MySQL tạo uuid cho trường tùy chỉnh có tên aidvà tôi đã đặt $incrementing = false;nhưng nó cũng không trả về!
SaidbakR

@SaidbakR trong khi sự thật, xin vui lòng bạn có thể chỉ ra phần của tài liệu Laravel nơi bạn có thông tin rất quan trọng này?
Damilola Olowookere

@DamilolaOlowookere Đây là những gì tôi đã tìm thấy trong ứng dụng của mình sử dụng Laravel 5.4.
SaidbakR

121

xdazz đúng trong trường hợp này, nhưng vì lợi ích của khách truy cập trong tương lai, những người có thể đang sử dụng DB::statementhoặc DB::insert, có một cách khác:

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

43
Trên thực tế, bạn có thể làm điều đó ngay trong phần chèn$id = DB::table('someTable')->insertGetId( ['field' => Input['data']);
Casey

1
@Casey làm theo cách này sẽ không cập nhật dấu thời gian trong DB
Rafael

@Rafael, nếu bạn muốn cập nhật timestampsbằng cách sử dụng insertGetId, vui lòng kiểm tra tại đây
Frank Myat Thu

Chính xác những gì tôi đang tìm kiếm vào ngày khác! Ngoài ra, insertGetIdchỉ hoạt động nếu các cột id thực sự được gọi là "id".
Thuyền trưởng Hypertext

@Benubird, tôi đã có giải pháp của tôi theo câu trả lời của bạn.
Bhavin Thummar

58

Đối với bất kỳ ai cũng thích cách Jeffrey Way sử dụng Model::create()trong hướng dẫn Laracasts 5 của mình, anh ta chỉ cần gửi Yêu cầu thẳng vào cơ sở dữ liệu mà không đặt rõ ràng từng trường trong bộ điều khiển và sử dụng mô hình $fillableđể gán khối lượng (rất quan trọng, cho bất kỳ ai mới và sử dụng bằng cách này): Tôi đã đọc rất nhiều người đang sử dụng insertGetId()nhưng thật không may, điều này không tôn trọng $fillabledanh sách trắng nên bạn sẽ gặp lỗi khi cố gắng chèn _token và bất cứ điều gì không phải là một trường trong cơ sở dữ liệu, cuối cùng thiết lập những thứ bạn muốn bộ lọc, v.v ... Điều đó làm tôi thất vọng, vì tôi muốn sử dụng phân công hàng loạt và tổng thể viết ít mã hơn khi có thể. May mắn thay, createphương thức của Eloquent chỉ gói gọn phương thức lưu (những gì @xdazz đã trích dẫn ở trên), vì vậy bạn vẫn có thể lấy ID được tạo cuối cùng ...

public function store() {

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

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

2
Ví dụ này không hoạt động với tôi trong 5.1, nhưng điều này đã làm:$new = Company::create($input); return redirect('company/'.$new->id);
timgavin

2
Điều này giả định rằng tên trường yêu cầu giống như các cột cơ sở dữ liệu tương ứng của chúng. Điều này không phải luôn luôn như vậy (ví dụ mã di sản) ..
mosid

48

Nếu bảng có id tăng tự động, hãy sử dụng phương thức insertGetId để chèn bản ghi và sau đó lấy ID:

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

Tham khảo: https://laravel.com/docs/5.1/queries#inserts


Những gì bạn mô tả trông giống như chụp lần chèn cuối cùng bằng Fluent. Câu hỏi là về Eloquent. Nó sẽ trông giống như: $ id = Model :: created ('phiếu' => 0]) -> id; Như được mô tả trong câu trả lời trên: stackoverflow.com/a/21084888/436443
Jeffz

46

**** Dành cho Laravel ****

Đầu tiên tạo một đối tượng, sau đó đặt giá trị thuộc tính cho đối tượng đó, sau đó lưu bản ghi đối tượng và sau đó lấy id được chèn cuối cùng. nhu la

$user = new User();        

$user->name = 'John';  

$user->save();

// Bây giờ Lấy id được chèn lần cuối

$insertedId = $user->id;

echo $insertedId ;

16

Trong laravel 5: bạn có thể làm điều này:

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

Đây là một ví dụ:

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

Điều này làm việc cho tôi trong laravel 4.2

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

11

Đây là cách chúng ta có thể nhận id được chèn cuối cùng trong 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

Sử dụng insertGetIdđể chèn và được chèn idcùng một lúc

Từ tài liệu

Nếu bảng có id tăng tự động, hãy sử dụng phương thức insertGetId để chèn bản ghi và sau đó lấy ID:

Bởi Model

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

Bởi DB

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

Để biết thêm chi tiết: https://laravel.com/docs/5.5/queries#inserts


6

Sau khi lưu mô hình, phiên bản khởi tạo có 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

Để chèn ()

Thí dụ:

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

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

3

Trong Laravel 5.2 tôi sẽ làm cho nó sạch nhất có thể:

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

3

Sau

$data->save()

$data->id sẽ cung cấp cho bạn id được chèn,

Lưu ý: Nếu tên cột tự động của bạn là sno thì bạn nên sử dụng $data->snovà không$data->id


2

Sau khi lưu bản ghi trong cơ sở dữ liệu, bạn có thể truy cập id bằng cách$data->id

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

2

Đối với Laravel, nếu bạn chèn một bản ghi mới và gọi $data->save()hàm này sẽ thực thi truy vấn INSERT và trả về giá trị khóa chính (ví dụ id theo mặc định).

Bạn có thể sử dụng mã sau đây:

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

Bạn có thể làm được việc này:

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

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

1

Để lấy id được chèn cuối cùng trong cơ sở dữ liệu Bạn có thể sử dụng

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

ở đây $ lastInsertedId sẽ cung cấp cho bạn id tăng tự động được chèn lần cuối.


1

Cách ngắn nhất có lẽ là một cuộc gọi của refresh()mô hình:

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

1

Mặc dù câu hỏi này là một chút ngày. Giải pháp nhanh chóng và bẩn thỉu của tôi sẽ như thế này:

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

Nhưng tôi đoán nó dễ bị tổn thương trong điều kiện chủng tộc trên cơ sở dữ liệu thường xuyên.


1
Cảm ơn! Điều này tôi có thể sử dụng trong đường ống của tôi. Vì vậy, không phải lo lắng về điều kiện chủng tộc và mã đẹp.
Daantje

1

Bạn cũng có thể thử như thế này:

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

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

0

Sử dụng mô hình Eloquent

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

Sử dụng Trình tạo truy vấn

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

0

Sau khi tiết kiệm $data->save(). tất cả dữ liệu được đẩy vào bên trong $data. Vì đây là một đối tượng và hàng hiện tại chỉ được lưu gần đây bên trong $data. Vì vậy, cuối cùng insertIdsẽ được tìm thấy bên trong $data->id.

Mã phản hồi sẽ là:

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


0

Bạn có thể nhận id được chèn cuối cùng với cùng một đối tượng bạn gọi phương thức lưu;

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

Vì vậy, bạn có thể chỉ cần viết:

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

0

Bạn có thể dễ dàng tìm nạp Id bản ghi được chèn lần cuối

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

Đây là một mẹo tuyệt vời để tìm nạp Id từ bản ghi được chèn cuối cùng trong DB.


hai người dùng đồng thời thêm mô hình công ty cùng một lúc. điều này không đáng tin cậy vì bài đăng thứ 1 có thể lấy id của bài thứ 2 nếu đúng thời điểm. câu trả lời được chấp nhận là đáng tin cậy.
Alex

@Alex vui lòng kiểm tra, điều này đang hoạt động và giải pháp tốt nhất để lấy id được chèn cuối cùng từ các bản ghi.
Priyanka Patel

giải pháp cập nhật là tốt, tuy nhiên nó đòi hỏi nhiều mã hơn câu trả lời được chấp nhận. Chỉ cần làm $user->idlà đủ sau khi tạo để có id được chèn.
Alex

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

2
Bài đăng này đã được trả lời 3 năm trước. Vui lòng chỉnh sửa câu trả lời của bạn để thêm giải thích về lý do tại sao nó có thể giúp người dùng hoặc cách giúp giải quyết câu hỏi của OP theo cách tốt hơn.
Syfer

1
Cảm ơn bạn vì đoạn mã này, có thể cung cấp một số trợ giúp ngay lập tức. Một lời giải thích phù hợp sẽ cải thiện đáng kể giá trị giáo dục của nó bằng cách chỉ ra lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ giúp nó hữu ích hơn cho những độc giả tương lai với những câu hỏi tương tự, nhưng không giống nhau. Vui lòng chỉnh sửa câu trả lời của bạn để thêm giải thích và đưa ra dấu hiệu về những hạn chế và giả định được áp dụng. Chưa kể tuổi của câu hỏi và chất lượng thấp của câu trả lời của bạn.
GrumpyCrouton

-1

Sử dụng mô hình 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;

}

Sử dụng Trình tạo truy vấn

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

Để biết thêm các phương thức để nhận id hàng được chèn lần cuối trong Laravel: http://phpnotebook.com/95-laravel/127-3-methods-to-get-last-inserted-row-id-in-laravel


-1

Bạn có thể sử dụng $thisbiến xây dựng để đạt được "Id được chèn lần cuối bằng cách sử dụng Laravel Eloquent" (không thêm bất kỳ cột bổ sung nào) trong hàm hoặc bộ điều khiển hiện tại.

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

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.