Zdobądź ostatni wstawiony identyfikator za pomocą Laravel Eloquent

294

Obecnie używam poniższego kodu do wstawiania danych do tabeli:

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

Chcę zwrócić ostatni wstawiony identyfikator, ale nie wiem, jak go uzyskać.

Z poważaniem!

SoldierCorp
źródło

Odpowiedzi:

378

Po Save , $data->idpowinien być ostatni id dodaje.

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

Może być używany w ten sposób.

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

Aby zaktualizować wersję laravel, spróbuj tego

return response()->json(array('success' => true, 'last_insert_id' => $data->id), 200);
xdazz
źródło
2
Obiekt zawsze zwraca obiekt, ofc. To jest jedyna droga.
Cas Bloem,
40
Uważaj, jeśli jeśli identyfikator NIE jest automatycznie zwiększany, zawsze to zwróci 0. W moim przypadku id był ciągiem (UUID) i aby to zadziałało, musiałem dodać public $incrementing = false;w moim modelu.
Luís Cruz,
2
@milz Mam wyzwalacz MySQL, który generuje identyfikator UUID dla niestandardowego pola o nazwie aidi ustawiłem, $incrementing = false;ale też nie zwrócił!
SaidbakR
@ SaidbakR, chociaż jest prawdą, czy możesz wskazać sekcję dokumentu Laravela, w której otrzymałeś tę bardzo ważną informację?
Damilola Olowookere
@DamilolaOlowookere To właśnie znalazłem w mojej aplikacji korzystającej z Laravela 5.4.
SaidbakR
121

xdazz ma rację w tym przypadku, ale z korzyścią dla przyszłych użytkowników, którzy mogą korzystać DB::statementlub DB::insertistnieje inny sposób:

DB::getPdo()->lastInsertId();
Benubird
źródło
43
Właściwie możesz to zrobić bezpośrednio we wkładce$id = DB::table('someTable')->insertGetId( ['field' => Input['data']);
Casey
1
@Casey robiąc to w ten sposób nie zaktualizuje znaczników czasu w DB
Rafael
@Rafael, jeśli chcesz dokonać aktualizacji timestampsza pomocą insertGetId, uprzejmie sprawdź tutaj
Frank Myat Thu
Dokładnie to, czego szukałem innego dnia! insertGetIdDziała także tylko wtedy, gdy kolumny id są faktycznie nazywane „id”.
Kapitan Hypertext,
@Benubird, mam rozwiązanie zgodnie z twoją odpowiedzią.
Bhavin Thummar
57

Dla każdego, kto lubi również sposób, w jaki Jeffrey Way wykorzystuje Model::create()w swoich tutorialach Laracast 5, w których po prostu wysyła żądanie bezpośrednio do bazy danych bez jawnego ustawiania każdego pola w kontrolerze i używania modelu $fillabledo masowego przypisywania (bardzo ważne, dla każdego nowego i używającego w ten sposób): Czytam wiele osób korzystających, insertGetId()ale niestety nie szanuje $fillablebiałej listy, więc wystąpią błędy podczas próby wstawienia _token i wszystkiego, co nie jest polem w bazie danych, w końcu ustawianie rzeczy, które chcesz filtr itp. To mnie zaskoczyło, ponieważ chcę użyć przypisania masy i ogólnie napisać mniej kodu, jeśli to możliwe. Na szczęście createmetoda Eloquenta po prostu otacza metodę zapisywania (co przytoczono powyżej @xdazz), więc nadal możesz pobrać ostatnio utworzony identyfikator ...

public function store() {

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

    return redirect('company/'.$id);
}
Dave
źródło
2
Ten przykład nie działał dla mnie w 5.1, ale to $new = Company::create($input); return redirect('company/'.$new->id);
zadziałało
2
Zakłada się, że nazwa pól żądania jest taka sama jak ich odpowiednich kolumn bazy danych. Nie zawsze tak jest (np. Starsze kody).
mosid
48

Jeśli tabela ma identyfikator automatycznego przyrostu, użyj metody insertGetId, aby wstawić rekord, a następnie pobierz identyfikator:

$id = DB::table('users')->insertGetId([
    'email' => '[email protected]',
    'votes' => 0
]);

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

Aamir
źródło
To, co opisałeś, wygląda jak przechwytywanie ostatniej wstawki za pomocą Fluent. Pytanie dotyczyło Elokwencji. Wyglądałoby to bardziej: $ id = Model :: create ('głosów' => 0]) -> id; Jak opisano w powyższej odpowiedzi: stackoverflow.com/a/21084888/436443
Jeffz
46

**** For Laravel ****

Najpierw utwórz obiekt, następnie ustaw wartość atrybutów dla tego obiektu, następnie zapisz rekord obiektu, a następnie pobierz ostatni wstawiony identyfikator. Jak na przykład

$user = new User();        

$user->name = 'John';  

$user->save();

// Teraz pobierany ostatni wstawiony identyfikator

$insertedId = $user->id;

echo $insertedId ;
Majbah Habib
źródło
16

W Laravel 5: możesz to zrobić:

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
źródło
15

Oto przykład:

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
źródło
15

Działa to dla mnie w Laravel 4.2

$id = User::insertGetId([
    'username' => Input::get('username'),
    'password' => Hash::make('password'),
    'active'   => 0
]);
użytkownik 28864
źródło
11

Oto, w jaki sposób możemy uzyskać ostatni wstawiony identyfikator w 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.');
    }
Qamar Uzman
źródło
11

Służy insertGetIddo wstawiania i wstawiania idjednocześnie

Od dok

Jeśli tabela ma identyfikator automatycznego przyrostu, użyj metody insertGetId, aby wstawić rekord, a następnie pobierz identyfikator:

Przez Model

$id = Model::insertGetId(["name"=>"Niklesh","email"=>"[email protected]"]);

Przez DB

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

Aby uzyskać więcej informacji: https://laravel.com/docs/5.5/queries#inserts

Niklesh Raut
źródło
6

Po zapisaniu modelu zainicjowana instancja ma identyfikator:

$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
źródło
6

Dla wstawiania ()

Przykład:

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

$insert_id = CreditVoucher::insert($data1);
$id = DB::getPdo()->lastInsertId();
dd($id);
Faridul Khan
źródło
3

W Laravel 5.2 uczynię go tak czystym, jak to możliwe:

public function saveContact(Request $request, Contact $contact)
{
   $create = $contact->create($request->all());
   return response()->json($create->id,  201);
}
bobbybackblech
źródło
3

Po

$data->save()

$data->id da ci wstawiony identyfikator,

Uwaga: Jeśli nazwa kolumny z autoinkrementacją to sno , powinieneś jej użyć, $data->snoa nie$data->id

Abhishek Goel
źródło
2

Po zapisaniu rekordu w bazie danych możesz uzyskać dostęp do identyfikatora przez$data->id

return Response::json(['success' => true, 'last_insert_id' => $data->id], 200)
Tayyab Hussain
źródło
2

W przypadku Laravela, jeśli wstawisz nowy rekord i wywołasz $data->save()tę funkcję, uruchomi się zapytanie INSERT i zwróci wartość klucza podstawowego (tzn. Domyślnie id ).

Możesz użyć następującego kodu:

if($data->save()) {
    return Response::json(array('status' => 1, 'primary_id'=>$data->id), 200);
}
HItesh Tank
źródło
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
źródło
1

Możesz to zrobić:

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

$lastInsertId=app('db')->getPdo()->lastInsertId();
Zając Dnyaneshwar
źródło
1

Aby uzyskać ostatni wstawiony identyfikator w bazie danych, możesz użyć

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

tutaj $ lastInsertedId daje ci ostatni wstawiony identyfikator automatycznego przyrostu.

PPL
źródło
1

Najkrótszą drogą jest prawdopodobnie wywołanie refresh()modelu:

public function create(array $data): MyModel
{
    $myModel = new MyModel($dataArray);
    $myModel->saveOrFail();
    return $myModel->refresh();
}
automatix
źródło
1

Chociaż to pytanie jest trochę przestarzałe. Moje szybkie i brudne rozwiązanie wyglądałoby tak:

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

Ale myślę, że jest podatny na warunki wyścigowe w bardzo często odwiedzanych bazach danych.

dustypaws - Przywróć Monikę
źródło
1
Dzięki! Mógłbym to wykorzystać w moim rurociągu. Więc nie martw się warunkami wyścigu i pięknym kodem.
Daantje
1

Możesz także spróbować w ten sposób:

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

    $last_insert_id = $data->id;
    return $last_insert_id;
}
Rasheduzzaman
źródło
0

Korzystanie z elokwentnego modelu

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

Korzystanie z Kreatora zapytań

$lastId = DB::table('reports')->insertGetId(['email' => '[email protected]']);
Srmilon
źródło
0

Po zapisaniu $data->save(). wszystkie dane są wpychane do środka $data. Ponieważ jest to obiekt, a bieżący wiersz został właśnie zapisany w środku $data. więc ostatni insertIdznajdzie się w środku$data->id .

Kod odpowiedzi będzie:

return Response::json(array('success' => true, 'last_insert_id' => $data->id), 200);
Sabuz
źródło
0

Opcjonalną metodą będzie:

$lastID = DB::table('EXAMPLE-TABLE')
                ->orderBy('id', 'desc')
                ->first();

$lastId = $lastProduct->id;

Źródło z wersji Laravel 5.8

Gustavo Morillo Marin
źródło
0

Ostatni wstawiony identyfikator możesz uzyskać za pomocą tego samego obiektu, który nazywasz metodą save;

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

Możesz więc po prostu napisać:

if ($data->save()) {
    return Response::json(array('success' => true,'inserted_id'=>$data->id), 200);
}
infomasud
źródło
0

Możesz łatwo pobrać ostatnio wstawiony identyfikator rekordu

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

To niesamowita sztuczka, aby pobrać identyfikator z ostatniego wstawionego rekordu w bazie danych.

Priyanka Patel
źródło
dwóch jednoczesnych użytkowników dodających jednocześnie do modelu firmy. nie jest to wiarygodne, ponieważ pierwszy post może uzyskać identyfikator drugiego, jeśli czas jest odpowiedni. zaakceptowana odpowiedź jest wiarygodna.
Alex
@Alex uprzejmie sprawdź, czy to działa i jest najlepszym rozwiązaniem, aby uzyskać ostatni wstawiony identyfikator z rekordów.
Priyanka Patel
zaktualizowane rozwiązanie jest w porządku, jednak wymaga więcej kodu niż zaakceptowana odpowiedź. Po $user->idutworzeniu wystarczy zrobić , aby uzyskać wstawiony identyfikator.
Alex
-1
public function store( UserStoreRequest $request ) {
    $input = $request->all();
    $user = User::create($input);
    $userId=$user->id 
}
konto tymczasowe
źródło
2
Odpowiedzi na ten post udzielono 3 lata temu. Edytuj swoją odpowiedź, aby dodać więcej wyjaśnień, dlaczego może ona pomóc użytkownikowi lub w jaki sposób pomaga lepiej rozwiązać pytanie PO.
Syfer,
1
Dziękujemy za ten fragment kodu, który może zapewnić natychmiastową pomoc. Właściwe wyjaśnienie znacznie poprawiłoby jego wartość edukacyjną, pokazując, dlaczego jest to dobre rozwiązanie problemu i uczyniłoby to bardziej użytecznym dla przyszłych czytelników z podobnymi, ale nie identycznymi pytaniami. Edytuj swoją odpowiedź, aby dodać wyjaśnienie i podać, jakie ograniczenia i założenia mają zastosowanie. Nie wspominając już o wieku pytania i niskiej jakości odpowiedzi.
GrumpyCrouton
-1

Korzystanie z elokwentnego modelu

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;

}

Korzystanie z Kreatora zapytań

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

Aby uzyskać więcej metod uzyskania identyfikatora Last Inserted Row w Laravel: http://phpnotebook.com/95-laravel/127-3-methods-to-get-last-inserted-row-id-in-laravel

Karthik
źródło
-1

Możesz użyć $thiszmiennej konstruktora, aby uzyskać „Last Inserted Id using Laravel Eloquent” (bez dodawania dodatkowej kolumny) w bieżącej funkcji lub kontrolerze.

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
źródło