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!

SoldierCorp
quelle

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);
xdazz
quelle
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();
Benubird
quelle
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);
}
Dave
quelle
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' => '[email protected]',
    'votes' => 0
]);

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

Aamir
quelle
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 ;
Majbah Habib
quelle
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;
    }
}
Mujibur
quelle
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);
}
Ngakak
quelle
15

Dies hat bei mir in Laravel 4.2 funktioniert

$id = User::insertGetId([
    'username' => Input::get('username'),
    'password' => Hash::make('password'),
    'active'   => 0
]);
user28864
quelle
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.');
    }
Qamar Uzman
quelle
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"=>"[email protected]"]);

Durch DB

$id = DB::table('users')->insertGetId(["name"=>"Niklesh","email"=>"[email protected]"]);

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

Niklesh Raut
quelle
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
Amir
quelle
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);
Faridul Khan
quelle
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);
}
bobbybackblech
quelle
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

Abhishek Goel
quelle
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)
Tayyab Hussain
quelle
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);
}
Hochtank
quelle
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);
Kamal Maisuriya
quelle
1

Du kannst das:

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

$lastInsertId=app('db')->getPdo()->lastInsertId();
Dnyaneshwar Harer
quelle
1

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

$data = new YourModelName;
$data->name = 'Some Value';
$data->email = '[email protected]';
$data->save();
$lastInsertedId = $data->id;

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

PPL
quelle
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();
}
automatix
quelle
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.

Staubpfoten - Setzen Sie Monica wieder ein
quelle
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;
}
Rasheduzzaman
quelle
0

Verwenden des eloquenten Modells

$user = new Report();        
$user->email= '[email protected]';  
$user->save();
$lastId = $user->id;

Verwenden des Abfrage-Generators

$lastId = DB::table('reports')->insertGetId(['email' => '[email protected]']);
srmilon
quelle
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);
Sabuz
quelle
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);
}
infomasud
quelle
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.

Priyanka Patel
quelle
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 
}
temporäres Konto
quelle
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

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

}
WebGhost
quelle