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.