Holen Sie sich die zuletzt eingefügte ID mit Laravel Eloquent


294

Ich verwende derzeit den folgenden Code, um Daten in eine Tabelle einzufügen:

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

Ich möchte die zuletzt eingefügte ID zurückgeben, weiß aber nicht, wie ich sie erhalten soll.

Mit freundlichen Grüßen!

Antworten:


378

Nach speichern , $data->idsollte die letzte ID eingefügt sein.

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

Kann so verwendet werden.

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

Versuchen Sie dies für eine aktualisierte Laravel-Version

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

2
Ein Objekt gibt immer ein Objekt zurück, ofc. Dies ist der einzige Weg.
Cas Bloem

40
Beachten Sie, dass die ID immer automatisch zurückgegeben wird, wenn sie NICHT automatisch erhöht wird 0. In meinem Fall war die ID eine Zeichenfolge (UUID), und damit dies funktioniert, musste ich public $incrementing = false;mein Modell hinzufügen .
Luís Cruz

2
@milz Ich habe einen MySQL-Trigger, der die UUID für ein benutzerdefiniertes Feld mit dem Namen generiert, aidund ich habe festgelegt, $incrementing = false;aber es wird auch nicht zurückgegeben!
SaidbakR

@SaidbakR Obwohl wahr, können Sie bitte den Abschnitt des Laravel-Dokuments angeben, in dem Sie diese sehr wichtigen Informationen erhalten haben?
Damilola Olowookere

@DamilolaOlowookere Dies ist, was ich in meiner Anwendung gefunden hatte, die Laravel 5.4 verwendet.
SaidbakR

121

xdazz ist in diesem Fall richtig, aber zum Nutzen zukünftiger Besucher, die möglicherweise DB::statementoder verwenden DB::insert, gibt es einen anderen Weg:

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

43
Eigentlich können Sie es richtig in der Beilage machen$id = DB::table('someTable')->insertGetId( ['field' => Input['data']);
Casey

1
@Casey auf diese Weise wird keine Zeitstempel in der DB aktualisieren
Rafael

@Rafael, wenn Sie aktualisieren möchten , timestampsverwenden insertGetId, kindly überprüfen hier
Frank Myat Thu

Genau das, wonach ich neulich gesucht habe! Funktioniert auch insertGetIdnur, wenn die ID-Spalten tatsächlich "ID" heißen.
Kapitän Hypertext

@ Benubird, ich habe meine Lösung gemäß Ihrer Antwort.
Bhavin Thummar

58

Für alle, die auch mögen, wie Jeffrey Way Model::create()in seinen Laracasts 5-Tutorials verwendet, in denen er die Anforderung direkt in die Datenbank sendet, ohne jedes Feld im Controller explizit festzulegen, und die Modelle $fillablefür die Massenzuweisung verwendet (sehr wichtig, für alle, die neu sind und verwenden auf diese Weise): Ich habe viele Leute gelesen insertGetId(), die dies verwenden, aber leider wird die $fillableWhitelist nicht berücksichtigt, sodass beim Versuch, _token einzufügen, und bei allem, was kein Feld in der Datenbank ist, Fehler auftreten. Am Ende werden die gewünschten Einstellungen vorgenommen Filter usw. Das hat mich umgehauen, weil ich die Massenzuweisung verwenden und insgesamt weniger Code schreiben möchte, wenn dies möglich ist. Glücklicherweise schließt die createMethode von Eloquent nur die Speichermethode ein (was @xdazz oben zitiert hat), sodass Sie immer noch die zuletzt erstellte ID abrufen können ...

public function store() {

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

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

2
Dieses Beispiel hat bei mir in 5.1 nicht funktioniert, aber es hat funktioniert:$new = Company::create($input); return redirect('company/'.$new->id);
Timgavin

2
Dies setzt voraus, dass der Name des Anforderungsfelds mit den jeweiligen Datenbankspalten übereinstimmt. Was nicht immer der Fall ist (z. B. Legacy-Codes).
Mosid

48

Wenn die Tabelle eine automatisch inkrementierende ID hat, verwenden Sie die Methode insertGetId, um einen Datensatz einzufügen, und rufen Sie dann die ID ab:

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

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


Was Sie beschrieben haben, sieht so aus, als würden Sie den letzten Einsatz mit Fluent erfassen. Die Frage betraf Eloquent. Es würde eher so aussehen: $ id = Model :: create ('Stimmen' => 0]) -> id; Wie in dieser Antwort oben beschrieben: stackoverflow.com/a/21084888/436443
Jeffz

46

**** Für Laravel ****

Erstellen Sie zuerst ein Objekt, legen Sie dann den Attributwert für dieses Objekt fest, speichern Sie dann den Objektdatensatz und erhalten Sie die zuletzt eingefügte ID. sowie

$user = new User();        

$user->name = 'John';  

$user->save();

// Jetzt die zuletzt eingefügte ID erhalten

$insertedId = $user->id;

echo $insertedId ;

16

In Laravel 5: können Sie dies tun:

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

Hier ist ein Beispiel:

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

Dies hat bei mir in Laravel 4.2 funktioniert

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

11

Hier ist, wie wir die zuletzt in Laravel 4 eingefügte ID erhalten können

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

Verwenden Sie insertGetIdzum Einfügen und erhalten eingefügtid gleichzeitig zu werden

Aus doc

Wenn die Tabelle eine automatisch inkrementierende ID hat, verwenden Sie die Methode insertGetId, um einen Datensatz einzufügen, und rufen Sie dann die ID ab:

Durch Model

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

Durch DB

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

Für weitere Informationen: https://laravel.com/docs/5.5/queries#inserts


6

Nach dem Speichern des Modells hat die initialisierte Instanz die 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

Zum Einfügen ()

Beispiel:

$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 würde ich es so sauber wie möglich machen:

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

3

Nach

$data->save()

$data->id gibt Ihnen die eingefügte ID,

Hinweis: Wenn Ihr Spaltenname für die automatische Inkrementierung sno lautet, sollten Sie verwenden $data->snound nicht$data->id


2

Nach dem Speichern eines Datensatzes in der Datenbank können Sie auf die ID von zugreifen$data->id

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

2

Wenn Sie für Laravel einen neuen Datensatz einfügen und $data->save()diese Funktion aufrufen , wird eine INSERT-Abfrage ausgeführt und der Primärschlüsselwert (dh die ID) zurückgegeben standardmäßig die ).

Sie können folgenden Code verwenden:

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

Du kannst das:

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

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

1

Zum Abrufen der zuletzt in die Datenbank eingefügten ID können Sie verwenden

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

Hier gibt $ lastInsertedId die zuletzt eingefügte Auto-Inkrement-ID an.


1

Der kürzeste Weg ist wahrscheinlich ein Aufruf des refresh()Modells:

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

1

Obwohl diese Frage etwas veraltet ist. Meine schnelle und schmutzige Lösung würde so aussehen:

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

Aber ich denke, es ist anfällig für Rennbedingungen in stark frequentierten Datenbanken.


1
Vielen Dank! Dies könnte ich in meiner Pipeline verwenden. Also keine Sorge um die Rennbedingungen und den schönen Code.
Daantje

1

Sie können auch Folgendes versuchen:

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

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

0

Verwenden des eloquenten Modells

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

Verwenden des Abfrage-Generators

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

0

Nach dem Speichern $data->save(). Alle Daten werden hineingeschoben $data. Da dies ein Objekt ist und die aktuelle Zeile erst kürzlich darin gespeichert wurde $data. so wird zuletzt insertIddrinnen gefunden$data->id .

Der Antwortcode lautet:

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


0

Sie können die zuletzt eingefügte ID mit demselben Objekt abrufen, das Sie als Speichermethode aufrufen.

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

Sie können also einfach schreiben:

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

0

Sie können die zuletzt eingefügte Datensatz-ID problemlos abrufen

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

Es ist ein großartiger Trick, die ID aus dem zuletzt eingefügten Datensatz in der Datenbank abzurufen.


Zwei gleichzeitige Benutzer fügen das gleichzeitig zum Unternehmensmodell hinzu. Dies ist nicht zuverlässig, da der erste Beitrag möglicherweise die ID des zweiten erhält, wenn das Timing stimmt. Die akzeptierte Antwort ist zuverlässig.
Alex

@Alex bitte überprüfen, dies funktioniert und die beste Lösung, um die zuletzt eingefügte ID aus Datensätzen zu erhalten.
Priyanka Patel

Die aktualisierte Lösung ist in Ordnung, erfordert jedoch mehr Code als die akzeptierte Antwort. $user->idNach dem Erstellen reicht es aus, dies einfach zu tun , um die eingefügte ID zu erhalten.
Alex

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

2
Dieser Beitrag wurde vor 3 Jahren beantwortet. Bitte bearbeiten Sie Ihre Antwort, um weitere Erklärungen hinzuzufügen, warum dies dem Benutzer helfen könnte oder wie es hilft, die Frage des OP besser zu lösen.
Syfer

1
Vielen Dank für dieses Code-Snippet, das möglicherweise sofortige Hilfe bietet. Eine richtige Erklärung würde den Bildungswert erheblich verbessern , indem sie zeigt, warum dies eine gute Lösung für das Problem ist, und sie für zukünftige Leser mit ähnlichen, aber nicht identischen Fragen nützlicher machen. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, und geben Sie an, welche Einschränkungen und Annahmen gelten. Ganz zu schweigen vom Alter der Frage und der geringen Qualität Ihrer Antwort.
GrumpyCrouton

-1

Verwenden des eloquenten Modells

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;

}

Verwenden des Abfrage-Generators

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

Weitere Methoden zum Abrufen der ID der zuletzt eingefügten Zeile in Laravel: http://phpnotebook.com/95-laravel/127-3-methods-to-get-last-inserted-row-id-in-laravel


-1

Sie können die $thisKonstruktorvariable verwenden, um "Zuletzt eingefügte ID mit Laravel Eloquent" (ohne zusätzliche Spalte hinzuzufügen) in der aktuellen Funktion oder Steuerung zu erzielen.

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

}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.