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!

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

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

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

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' => 'john@example.com',
    'votes' => 0
]);

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


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 ;

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

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

15

Działa to dla mnie w Laravel 4.2

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

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.');
    }

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"=>"myemail@gmail.com"]);

Przez DB

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

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


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

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

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

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


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)

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

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

Możesz to zrobić:

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

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

1

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

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

tutaj $ lastInsertedId daje ci ostatni wstawiony identyfikator automatycznego przyrostu.


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

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.


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

0

Korzystanie z elokwentnego modelu

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

Korzystanie z Kreatora zapytań

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

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


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

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.


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 
}

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


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

}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.