लारवेल एलोकेंट का उपयोग करके अंतिम सम्मिलित आईडी प्राप्त करें


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

अद्यतन किए गए लार्वा संस्करण के लिए यह प्रयास करें

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

2
एक वस्तु हमेशा एक वस्तु, inc लौटाती है। यही एकमात्र रास्ता है।
Cas Bloem

40
खबरदार कि अगर आईडी निरंकुश नहीं है, तो यह हमेशा वापस आ जाएगी 0। मेरे मामले में आईडी एक स्ट्रिंग (UUID) थी और इसे काम करने के लिए मुझे public $incrementing = false;अपने मॉडल में जोड़ना था ।
लुइज़ क्रूज़

2
@milz मेरे पास MySQL ट्रिगर है जो नाम के कस्टम क्षेत्र के लिए यूआईडी जनरेट करता है aidऔर मैंने सेट किया है, $incrementing = false;लेकिन यह भी वापस नहीं आया है!
सहदबकर

@SaidbakR सच होते हुए, क्या आप लारवेल डॉक के उस हिस्से को इंगित कर सकते हैं जहाँ आपको यह बहुत महत्वपूर्ण जानकारी मिली है?
दामिलोला ओलूकेयर

@DamilolaOlowookere यह वही है जो मैंने अपने आवेदन में पाया था जो लारवेल 5.4 का उपयोग करता है।
सईदबकर

121

इस मामले में xdazz सही है, लेकिन भविष्य के आगंतुकों के लाभ के लिए जो उपयोग कर सकते हैं DB::statementया DB::insert, एक और तरीका है:

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

43
वास्तव में आप इसे सम्मिलित रूप से कर सकते हैं$id = DB::table('someTable')->insertGetId( ['field' => Input['data']);
केसी

1
@ कैसी इस तरह से करने से डीबी में टाइमस्टैम्प अपडेट नहीं होगा
राफेल

@ राफेल, यदि आप timestampsका उपयोग कर अद्यतन करना चाहते हैं, तो insertGetIdकृपया यहां देखें
फ्रैंक मायट थू

बिल्कुल वही जो मैं दूसरे दिन ढूंढ रहा था! इसके अलावा, insertGetIdकेवल तभी काम करता है जब आईडी कॉलम को वास्तव में "आईडी" कहा जाता है।
कप्तान हाइपरटेक्स्ट

@ बेनुबर्ड, मुझे आपके उत्तर के अनुसार मेरा समाधान मिल गया है।
भाविन थुम्मर

57

जो भी पसंद करता है किसी के लिए भी जेफरी वे Model::create()अपने लार्कास्ट 5 ट्यूटोरियल में उपयोग करता है, जहां वह सिर्फ नियंत्रक में प्रत्येक क्षेत्र को स्पष्ट रूप से सेट किए बिना डेटाबेस में सीधे अनुरोध भेजता है, और $fillableबड़े पैमाने पर असाइनमेंट के लिए मॉडल का उपयोग करना (बहुत महत्वपूर्ण, किसी के लिए भी नया और उपयोग करना) इस तरह): मैंने बहुत सारे लोगों को पढ़ा है insertGetId()लेकिन दुर्भाग्य से यह $fillableश्वेतसूची का सम्मान नहीं करता है, इसलिए आपको इसमें त्रुटियां मिलेंगी, जिसमें _token और कुछ भी जो डेटाबेस में फ़ील्ड नहीं है, जो आप चाहते हैं उन्हें सेट करने की कोशिश कर रहे हैं। फ़िल्टर इत्यादि, जिसने मुझे निराश किया, क्योंकि मैं बड़े पैमाने पर असाइनमेंट का उपयोग करना चाहता हूं और जब भी संभव हो, कुल मिलाकर कम कोड लिखता हूं। सौभाग्य से एलक्विंट की createविधि सिर्फ सेव विधि (जो @xdazz ऊपर उद्धृत है) को लपेटती है, इसलिए आप अभी भी अंतिम निर्मित आईडी खींच सकते हैं ...

public function store() {

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

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

2
यह उदाहरण मेरे लिए ५.१ में काम नहीं आया, लेकिन इसने किया:$new = Company::create($input); return redirect('company/'.$new->id);
टाइमगैविन

2
यह मानता है कि अनुरोध फ़ील्ड नाम उनके संबंधित डेटाबेस स्तंभों के समान हैं। जो हमेशा मामला नहीं होता है (उदाहरण के लिए विरासत कोड) ..
मस्जिद

48

यदि तालिका में एक ऑटो-इंक्रीमेंटिंग आईडी है, तो रिकॉर्ड डालने के लिए InsertGetId विधि का उपयोग करें और फिर ID प्राप्त करें:

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

देखें: https://laravel.com/docs/5.1/queries#inserts


आपने जो वर्णन किया है, वह धाराप्रवाह का उपयोग करके अंतिम प्रविष्टि को कैप्चर करने जैसा लगता है। प्रश्न एलोकेंट के बारे में था। यह अधिक दिखेगा: $ id = मॉडल :: create ('वोट' => 0]) -> id; जैसा कि ऊपर दिए गए उत्तर में बताया गया है: stackoverflow.com/a/21084888/436443
Jeffz

46

**** लारवेल के लिए ****

सबसे पहले एक ऑब्जेक्ट बनाएं, फिर उस ऑब्जेक्ट के लिए विशेषता मान सेट करें, फिर ऑब्जेक्ट रिकॉर्ड सहेजें, और फिर अंतिम सम्मिलित आईडी प्राप्त करें। जैसे कि

$user = new User();        

$user->name = 'John';  

$user->save();

// अब लास्ट में डाला गया आईडी

$insertedId = $user->id;

echo $insertedId ;

16

लार्वा 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

इसने मेरे लिए लार्वा 4.2 में काम किया

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

11

यहाँ बताया गया है कि कैसे हम 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

से दस्तावेज़

यदि तालिका में एक ऑटो-इंक्रीमेंटिंग आईडी है, तो रिकॉर्ड डालने के लिए 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

मॉडल को बचाने के बाद, प्रारंभिक उदाहरण में आईडी है:

$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

लारवेल 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 आपको सम्मिलित आईडी देगा,

नोट: यदि आपका ऑटोइन्क्रिमेंट कॉलम नाम स्नो है तो आपको इसका उपयोग करना चाहिए $data->snoऔर नहीं$data->id


2

बाद बचत डेटाबेस में एक रिकार्ड है, तो आप उपयोग कर सकते हैं आईडी द्वारा$data->id

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

2

Laravel के लिए, यदि आप एक नया रिकॉर्ड सम्मिलित करते हैं और $data->save()इस फ़ंक्शन को कॉल करते हैं, तो INSERT क्वेरी निष्पादित करता है और प्राथमिक कुंजी मान (यानी डिफ़ॉल्ट रूप से आईडी ) लौटाता है ।

आप निम्नलिखित कोड का उपयोग कर सकते हैं:

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

डेटाबेस में अंतिम सम्मिलित आईडी के लिए आप उपयोग कर सकते हैं

$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
धन्यवाद! यह मैं अपनी पाइपलाइन में इस्तेमाल कर सकता हूं। इसलिए दौड़ की स्थिति और सुंदर कोड के बारे में कोई चिंता नहीं है।
दांतेजी

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

आप एक ही ऑब्जेक्ट के साथ अंतिम सम्मिलित आईडी प्राप्त कर सकते हैं जिसे आप सेव विधि कहते हैं;

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

यह DB में पिछले सम्मिलित रिकॉर्ड से Id लाने के लिए एक भयानक चाल है।


दो समवर्ती उपयोगकर्ता एक ही समय में कंपनी मॉडल में जोड़ रहे हैं। यह विश्वसनीय नहीं है क्योंकि यदि समय सही है तो 1 पोस्ट को 2 की आईडी मिल सकती है। स्वीकृत उत्तर विश्वसनीय है।
एलेक्स

@ एलेक्स कृपया जाँच करें, यह काम कर रहा है और रिकॉर्ड से अंतिम सम्मिलित आईडी प्राप्त करने का सबसे अच्छा समाधान है।
प्रियंका पटेल

अद्यतन समाधान ठीक है, हालाँकि इसके लिए स्वीकृत उत्तर की तुलना में अधिक कोड की आवश्यकता होती है। $user->idसम्मिलित आईडी प्राप्त करने के लिए बनाने के बाद बस करना पर्याप्त है।
एलेक्स

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

2
इस पोस्ट का जवाब 3 साल पहले दिया गया था। कृपया अपने उत्तर को संपादित करने के लिए और अधिक स्पष्टीकरण जोड़ें कि यह उपयोगकर्ता की मदद कैसे कर सकता है या कैसे इसकी मदद करता है ओपी के प्रश्न को बेहतर तरीके से हल करता है।
सफ़र

1
इस कोड स्निपेट के लिए धन्यवाद, जो कुछ तत्काल सहायता प्रदान कर सकता है। एक उचित व्याख्या यह दर्शाती है कि यह समस्या का एक अच्छा समाधान क्यों है, यह दिखाते हुए इसके शैक्षिक मूल्य में बहुत सुधार करेगा , और यह भविष्य के पाठकों के लिए समान रूप से उपयोगी होगा, लेकिन समान नहीं, प्रश्न। कृपया स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें, और इस बात का संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं। प्रश्न की उम्र और आपके उत्तर की कम गुणवत्ता का उल्लेख नहीं करना चाहिए।
ग्रुम्पी क्राउटन

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

लारवेल में अंतिम सम्मिलित पंक्ति आईडी प्राप्त करने के लिए और अधिक तरीकों के लिए: http://phpnotebook.com/95-laravel/127-3-methods-to-get-last-inserted-row-id-in-laravel


-1

आप $thisवर्तमान फ़ंक्शन या नियंत्रक में "लास्ट इंसर्स्ड आईडी का उपयोग कर लार्वा एलोकेंट" (किसी भी अतिरिक्त कॉलम को जोड़े बिना) प्राप्त करने के लिए कंस्ट्रक्टर चर का उपयोग कर सकते हैं ।

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

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.