รับรหัสที่แทรกล่าสุดโดยใช้คำสั่ง Laravel


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

ฉันต้องการคืนรหัสประจำตัวที่แทรกล่าสุด แต่ฉันไม่ทราบวิธีการรับ

ขอแสดงความนับถือ!

คำตอบ:


378

หลังจากบันทึกแล้ว$data->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 นี่เป็นวิธีเดียวที่จะไป
Cas Bloem

40
ระวังว่าถ้าประชาชนไม่ autoincrement 0นี้มักจะกลับ ในกรณีของฉัน id เป็นสตริง (UUID) และเพื่อการทำงานฉันต้องเพิ่มpublic $incrementing = false;ในแบบจำลองของฉัน
Luís Cruz

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

1
@ กรณีที่ทำเช่นนี้ด้วยวิธีนี้จะไม่อัปเดตการประทับเวลาใน DB
Rafael

@Rafael หากคุณต้องการอัพเดทtimestampsโดยใช้insertGetIdโปรดตรวจสอบที่นี่
Frank Myat Thu

สิ่งที่ฉันกำลังมองหาในวันอื่น ๆ ! นอกจากนี้insertGetIdจะใช้งานได้ก็ต่อเมื่อคอลัมน์รหัสนั้นเรียกว่า "id" เท่านั้น
Captain Hypertext

@ Benubird ฉันมีทางออกตามคำตอบของคุณ
Bhavin Thummar

58

สำหรับทุกคนที่ชอบวิธีที่ Jeffrey Way ใช้Model::create()ในการสอน Laracasts 5 ซึ่งเขาเพิ่งส่งคำขอไปยังฐานข้อมูลโดยตรงโดยไม่ต้องตั้งค่าแต่ละฟิลด์ในคอนโทรลเลอร์อย่างชัดเจนและใช้โมเดล$fillableสำหรับการมอบหมายจำนวนมาก (สำคัญมากสำหรับคนใหม่และใช้งาน ด้วยวิธีนี้): ฉันอ่านผู้คนจำนวนมากที่ใช้insertGetId()แต่น่าเสียดายที่นี่ไม่เคารพ$fillableรายการที่อนุญาตดังนั้นคุณจะได้รับข้อผิดพลาดโดยพยายามแทรก _token และสิ่งที่ไม่ใช่เขตข้อมูลในฐานข้อมูลสิ้นสุดการตั้งค่าสิ่งที่คุณต้องการ ตัวกรอง ฯลฯ นั่นทำให้ฉันรู้สึกอึดอัดใจเพราะฉันต้องการใช้การมอบหมายจำนวนมากและการเขียนรหัสโดยรวมให้น้อยลงเมื่อทำได้ โชคดีที่createวิธีของ Eloquent ล้อมรอบวิธีการบันทึก (@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);
timgavin

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 ****

สร้างวัตถุก่อนจากนั้นตั้งค่าคุณลักษณะสำหรับวัตถุนั้นจากนั้นให้บันทึกวัตถุและจากนั้นรับรหัสที่แทรกล่าสุด เช่น

$user = new User();        

$user->name = 'John';  

$user->save();

// ตอนนี้ได้รับรหัสที่แทรกล่าสุด

$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

นี่คือวิธีที่เราจะได้รับ id ที่แทรกล่าสุดใน 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

ใช้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

สำหรับแทรก ()

ตัวอย่าง:

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

3

หลังจาก

$data->save()

$data->id จะให้รหัสที่คุณใส่เข้าไป

หมายเหตุ:หากชื่อคอลัมน์การสร้างอัตโนมัติของคุณเป็นsnoคุณควรใช้ $data->snoและไม่$data->id


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

เพื่อรับ id ที่ถูกใส่เข้าไปล่าสุดในฐานข้อมูลคุณสามารถใช้

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

ที่นี่ $ lastInsertedId จะช่วยให้คุณเพิ่มรหัสอัตโนมัติล่าสุดใส่


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

คุณสามารถแทรก id ล่าสุดด้วยวัตถุเดียวกับที่คุณเรียกวิธีการบันทึก;

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

ดังนั้นคุณสามารถเขียน:

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

0

คุณสามารถดึงรหัสบันทึกที่แทรกล่าสุดได้อย่างง่ายดาย

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

มันเป็นเคล็ดลับที่ยอดเยี่ยมในการดึงข้อมูล Id จากระเบียนที่แทรกล่าสุดในฐานข้อมูล


ผู้ใช้สองคนพร้อมกันเพิ่มรูปแบบ บริษัท ในเวลาเดียวกัน สิ่งนี้ไม่น่าเชื่อถือเนื่องจากโพสต์ที่ 1 อาจได้รับ ID ของลำดับที่ 2 หากกำหนดเวลาถูกต้อง คำตอบที่ยอมรับมีความน่าเชื่อถือ
อเล็กซ์

@Alex กรุณาตรวจสอบว่านี่ใช้งานได้และเป็นทางออกที่ดีที่สุดในการรับ id ที่แทรกล่าสุดจากบันทึก
Priyanka Patel

โซลูชันที่อัปเดตนั้นใช้ได้ แต่ต้องใช้รหัสมากกว่าคำตอบที่ยอมรับ เพียงแค่ทำ$user->idก็เพียงพอหลังจากสร้างเพื่อรับรหัสที่แทรก
อเล็กซ์

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

สำหรับวิธีการเพิ่มเติมเพื่อรับ id แถวแทรกล่าสุดใน Laravel: http://phpnotebook.com/95-laravel/127-3-methods-to-get-last-inserted-row-id-in-laravel


-1

คุณสามารถใช้$thisตัวแปรคอนสตรัคเพื่อให้ได้ "รหัสแทรกล่าสุดโดยใช้ 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();

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.