Ottieni l'ultimo ID inserito usando Laravel Eloquent


294

Attualmente sto usando il codice seguente per inserire i dati in una tabella:

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

Voglio restituire l'ultimo ID inserito ma non so come ottenerlo.

Cordiali saluti!

Risposte:


378

Dopo il salvataggio , $data->iddovrebbe essere l'ultimo ID inserito.

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

Può essere usato in questo modo.

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

Per la versione aggiornata di laravel prova questo

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

2
Un oggetto restituisce sempre un oggetto, spesso. Questa è l'unica strada da percorrere.
Cas Bloem,

40
Fai attenzione che se l'id NON è autoincremento, questo ritornerà sempre 0. Nel mio caso l'id era una stringa (UUID) e per farlo funzionare ho dovuto aggiungere il public $incrementing = false;mio modello.
Luís Cruz,

2
@milz Ho un trigger MySQL che genera l'UUID per un campo personalizzato chiamato aide ho impostato $incrementing = false;ma non viene restituito troppo!
SaidbakR,

@SaidbakR è vero, per favore puoi indicare la sezione del documento Laravel in cui hai ottenuto queste informazioni molto importanti?
Damilola Olowookere,

@DamilolaOlowookere Questo è quello che avevo trovato nella mia applicazione che utilizza Laravel 5.4.
SaidbakR,

121

xdazz ha ragione in questo caso, ma a beneficio dei futuri visitatori che potrebbero utilizzare DB::statemento DB::insert, c'è un altro modo:

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

43
In realtà puoi farlo bene nell'inserto$id = DB::table('someTable')->insertGetId( ['field' => Input['data']);
Casey,

1
@Casey in questo modo non aggiorna i timestamp nel DB
Rafael

@Rafael, se si desidera aggiornare timestampsutilizzando insertGetId, si
prega

Esattamente quello che stavo cercando l'altro giorno! Inoltre, insertGetIdfunziona solo se le colonne id sono effettivamente chiamate "id".
Capitano Hypertext il

@Benubird, ho la mia soluzione secondo la tua risposta.
Bhavin Thummar,

58

Per chiunque ami anche il modo in cui Jeffrey Way utilizza Model::create()nei suoi tutorial su Laracasts 5, dove invia semplicemente la Richiesta direttamente nel database senza impostare esplicitamente ogni campo nel controller e utilizzare i modelli $fillableper l'assegnazione di massa (molto importante, per chiunque sia nuovo e che utilizzi in questo modo): ho letto molte persone che usano, insertGetId()ma sfortunatamente questo non rispetta la $fillablewhitelist, quindi otterrai errori nel tentativo di inserire _token e tutto ciò che non è un campo nel database, finisce per impostare le cose che vuoi filtro, ecc. Questo mi ha sconvolto, perché voglio usare l'assegnazione di massa e nel complesso scrivere meno codice quando possibile. Fortunatamente il createmetodo di Eloquent racchiude semplicemente il metodo di salvataggio (ciò che @xdazz ha citato sopra), quindi puoi ancora estrarre l'ultimo ID creato ...

public function store() {

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

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

2
Questo esempio non ha funzionato per me in 5.1, ma questo ha funzionato:$new = Company::create($input); return redirect('company/'.$new->id);
timgavin,

2
Ciò presuppone che il nome dei campi richiesta sia lo stesso delle rispettive colonne del database. Il che non è sempre il caso (codici legacy per esempio) ..
mosid,

48

Se la tabella ha un ID a incremento automatico, utilizzare il metodo insertGetId per inserire un record e quindi recuperare l'ID:

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

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


Quello che hai descritto sembra catturare l'ultimo inserto usando Fluent. La domanda riguardava Eloquent. Sarebbe più simile a: $ id = Model :: create ('voti' => 0]) -> id; Come descritto in questa risposta di cui sopra: stackoverflow.com/a/21084888/436443
Jeffz

46

**** Per Laravel ****

In primo luogo creare un oggetto, quindi impostare il valore degli attributi per quell'oggetto, quindi salvare il record dell'oggetto e quindi ottenere l'ultimo ID inserito. ad esempio

$user = new User();        

$user->name = 'John';  

$user->save();

// Ora sta ottenendo l'ultimo ID inserito

$insertedId = $user->id;

echo $insertedId ;

16

In laravel 5: puoi farlo:

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

Ecco un esempio:

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

Questo ha funzionato per me in laravel 4.2

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

11

Ecco come possiamo ottenere l'ultimo ID inserito in 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

Utilizzare insertGetIdper inserire e ottenere inseritoid contemporaneamente

Dal doc

Se la tabella ha un ID a incremento automatico, utilizzare il metodo insertGetId per inserire un record e quindi recuperare l'ID:

Di Model

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

Di DB

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

Per maggiori dettagli: https://laravel.com/docs/5.5/queries#inserts


6

Dopo aver salvato il modello, l'istanza inizializzata ha l'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

Per insert ()

Esempio:

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

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

3

In Laravel 5.2 lo renderei il più pulito possibile:

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

3

Dopo

$data->save()

$data->id ti darà l'id inserito,

Nota: se il nome della colonna di incremento automatico è sno, è necessario utilizzarlo $data->snoe non$data->id


2

Dopo il salvataggio di un record nel database, è possibile accedere a id da$data->id

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

2

Per Laravel, se si inserisce un nuovo record e si chiama $data->save()questa funzione esegue una query INSERT e restituisce il valore della chiave primaria (es. Id per impostazione predefinita).

Puoi usare il seguente codice:

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

Puoi farlo:

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

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

1

Per ottenere l'ultimo ID inserito nel database È possibile utilizzare

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

qui $ lastInsertedId ti darà l'ultimo ID di incremento automatico inserito.


1

Il modo più breve è probabilmente una chiamata del refresh()sul modello:

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

1

Anche se questa domanda è un po 'datata. La mia soluzione rapida e sporca sarebbe simile a questa:

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

Ma immagino che sia vulnerabile alle condizioni di gara su database altamente frequentati.


1
Grazie! Questo potrei usare nella mia pipeline. Quindi non preoccuparti delle condizioni di gara e del bellissimo codice.
Daantje,

1

Puoi anche provare in questo modo:

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

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

0

Utilizzando il modello eloquente

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

Utilizzo di Query Builder

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

0

Dopo il salvataggio $data->save(). tutti i dati vengono inseriti all'interno $data. Poiché si tratta di un oggetto e la riga corrente viene appena salvata di recente all'interno $data. quindi l'ultimo insertIdsarà trovato all'interno $data->id.

Il codice di risposta sarà:

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


0

È possibile ottenere l'ultimo ID inserito con lo stesso oggetto chiamato metodo save;

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

Quindi puoi semplicemente scrivere:

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

0

È possibile recuperare facilmente l'ultimo ID record inserito

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

È un trucco eccezionale recuperare l'ID dall'ultimo record inserito nel DB.


due utenti simultanei che aggiungono il modello aziendale contemporaneamente. questo non è affidabile in quanto il primo post potrebbe ottenere l'id del secondo se il tempismo è giusto. la risposta accettata è affidabile.
Alex

@Alex controlla gentilmente, questo funziona e la soluzione migliore per ottenere l'ultimo ID inserito dai record.
Priyanka Patel

la soluzione aggiornata va bene, tuttavia richiede più codice della risposta accettata. Basta fare $user->iddopo aver creato per ottenere l'id inserito.
Alex

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

2
A questo post è stata data risposta 3 anni fa. Modifica la tua risposta per aggiungere ulteriori spiegazioni sul perché potrebbe aiutare l'utente o su come aiuta a risolvere meglio la domanda del PO.
Syfer

1
Grazie per questo frammento di codice, che può fornire un aiuto immediato. Una spiegazione adeguata migliorerebbe notevolmente il suo valore educativo mostrando perché questa è una buona soluzione al problema e la renderebbe più utile ai futuri lettori con domande simili, ma non identiche. Modifica la tua risposta per aggiungere spiegazioni e fornire un'indicazione di quali limitazioni e ipotesi si applicano. Per non parlare dell'età della domanda e della bassa qualità della tua risposta.
GrumpyCrouton,

-1

Utilizzando il modello eloquente

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;

}

Utilizzo di Query Builder

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

Per altri metodi per ottenere l'ID ultima riga inserita in Laravel: http://phpnotebook.com/95-laravel/127-3-methods-to-get-last-inserted-row-id-in-laravel


-1

È possibile utilizzare la $thisvariabile del costruttore per ottenere "Ultimo ID inserito utilizzando Laravel Eloquent" (senza aggiungere alcuna colonna aggiuntiva) nella funzione o nel controller correnti.

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

}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.