Obtenez le dernier identifiant inséré à l'aide de Laravel Eloquent


294

J'utilise actuellement le code ci-dessous pour insérer des données dans un tableau:

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

Je veux retourner la dernière pièce d'identité insérée mais je ne sais pas comment l'obtenir.

Sincères amitiés!

Réponses:


378

Après l' enregistrement , $data->idle dernier identifiant doit être inséré.

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

Peut être utilisé comme ça.

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

Pour la version mise à jour de laravel, essayez ceci

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

2
Un objet renvoie toujours un objet, ofc. C'est le seul chemin à parcourir.
Cas Bloem

40
Attention, si l'identifiant n'est PAS auto-incrémenté, cela reviendra toujours 0. Dans mon cas, l'ID était une chaîne (UUID) et pour que cela fonctionne, j'ai dû ajouter public $incrementing = false;mon modèle.
Luís Cruz

2
@milz J'ai un déclencheur MySQL qui génère l'uuid pour un champ personnalisé nommé aidet je l'ai défini $incrementing = false;mais il ne revient pas trop!
SaidbakR

@SaidbakR bien que vrai, veuillez indiquer la section du document Laravel où vous avez obtenu ces informations très importantes?
Damilola Olowookere

@DamilolaOlowookere C'est ce que j'avais trouvé dans mon application qui utilise Laravel 5.4.
SaidbakR

121

xdazz a raison dans ce cas, mais pour le bénéfice des futurs visiteurs qui pourraient utiliser DB::statementou DB::insert, il existe une autre façon:

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

43
En fait, vous pouvez le faire directement dans l'encart$id = DB::table('someTable')->insertGetId( ['field' => Input['data']);
Casey

1
@Casey le fait de cette façon ne mettra pas à jour les horodatages dans la DB
Rafael

@Rafael, si vous voulez mettre à jour en timestampsutilisant insertGetId, veuillez vérifier ici
Frank Myat jeu

Exactement ce que je cherchais l'autre jour! En outre, cela insertGetIdne fonctionne que si les colonnes id sont réellement appelées "id".
Captain Hypertext

@Benubird, j'ai ma solution selon votre réponse.
Bhavin Thummar

58

Pour tous ceux qui aiment également la façon dont Jeffrey Way utilise Model::create()dans ses tutoriels Laracasts 5, où il envoie simplement la demande directement dans la base de données sans définir explicitement chaque champ dans le contrôleur, et en utilisant les modèles $fillablepour l'affectation de masse (très important, pour toute personne nouvelle et utilisant de cette façon): J'ai lu beaucoup de gens qui utilisent insertGetId()mais malheureusement cela ne respecte pas la $fillableliste blanche, donc vous aurez des erreurs en essayant d'insérer _token et tout ce qui n'est pas un champ dans la base de données, finissez par définir les choses que vous voulez filtrer, etc. Heureusement, la createméthode d'Eloquent encapsule simplement la méthode de sauvegarde (ce que @xdazz a cité ci-dessus), de sorte que vous pouvez toujours extraire le dernier ID créé ...

public function store() {

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

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

2
Cet exemple n'a pas fonctionné pour moi en 5.1, mais cela a fonctionné:$new = Company::create($input); return redirect('company/'.$new->id);
timgavin

2
Cela suppose que le nom des champs de demande est le même que leurs colonnes de base de données respectives. Ce qui n'est pas toujours le cas (anciens codes par exemple) ..
mosid

48

Si la table a un identifiant à incrémentation automatique, utilisez la méthode insertGetId pour insérer un enregistrement, puis récupérez l'ID:

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

Référez-vous à: https://laravel.com/docs/5.1/queries#inserts


Ce que vous avez décrit ressemble à la capture du dernier insert à l'aide de Fluent. La question portait sur Eloquent. Cela ressemblerait plus à: $ id = Model :: create ('votes' => 0]) -> id; Comme décrit dans cette réponse ci-dessus: stackoverflow.com/a/21084888/436443
Jeffz

46

**** Pour Laravel ****

Créez d'abord un objet, puis définissez la valeur des attributs pour cet objet, puis enregistrez l'enregistrement d'objet, puis obtenez le dernier identifiant inséré. tel que

$user = new User();        

$user->name = 'John';  

$user->save();

// Obtention du dernier identifiant inséré

$insertedId = $user->id;

echo $insertedId ;

16

Dans laravel 5: vous pouvez le faire:

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

Voici un exemple:

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

Cela a fonctionné pour moi dans laravel 4.2

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

11

Voici comment obtenir le dernier identifiant inséré dans 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

Utilisez insertGetIdpour insérer et être inséré iden même temps

De doc

Si la table a un identifiant à incrémentation automatique, utilisez la méthode insertGetId pour insérer un enregistrement, puis récupérez l'ID:

Par Model

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

Par DB

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

Pour plus de détails: https://laravel.com/docs/5.5/queries#inserts


6

Après avoir enregistré le modèle, l'instance initialisée a l'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

Pour insert ()

Exemple:

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

$insert_id = CreditVoucher::insert($data1);
$id = DB::getPdo()->lastInsertId();
dd($id);

3

Dans Laravel 5.2, je le rendrais aussi propre que possible:

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

3

Après

$data->save()

$data->id vous donnera l'identifiant inséré,

Remarque: Si le nom de votre colonne d'auto-incrémentation est sno, vous devez utiliser $data->snoet non$data->id


2

Après avoir sauvegardé un enregistrement dans la base de données, vous pouvez accéder à id en$data->id

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

2

Pour Laravel, si vous insérez un nouvel enregistrement et appelez $data->save()cette fonction exécute une requête INSERT et retourne la valeur de la clé primaire (ie id par défaut).

Vous pouvez utiliser le code suivant:

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

Tu peux le faire:

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

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

1

Pour obtenir le dernier identifiant inséré dans la base de données Vous pouvez utiliser

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

ici $ lastInserredId vous donnera le dernier identifiant d'incrémentation automatique inséré.


1

Le chemin le plus court est probablement un appel du refresh()sur le modèle:

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

1

Bien que cette question soit un peu datée. Ma solution rapide et sale ressemblerait à ceci:

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

Mais je suppose qu'il est vulnérable aux conditions de concurrence sur les bases de données très fréquentées.


1
Merci! Je pourrais l'utiliser dans mon pipeline. Donc, ne vous inquiétez pas des conditions de course et du beau code.
Daantje

1

Vous pouvez également essayer comme ceci:

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

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

0

Utilisation d'un modèle éloquent

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

Utilisation de Query Builder

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

0

Après l'enregistrement $data->save(). toutes les données sont poussées à l'intérieur $data. Comme il s'agit d'un objet et que la ligne actuelle vient d'être enregistrée récemment à l'intérieur $data. si dernier insertIdse trouvera à l'intérieur $data->id.

Le code de réponse sera:

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


0

Vous pouvez obtenir le dernier identifiant inséré avec le même objet que vous appelez la méthode save;

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

Vous pouvez donc simplement écrire:

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

0

Vous pouvez facilement récupérer le dernier identifiant d'enregistrement inséré

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

C'est une astuce géniale pour récupérer l'ID du dernier enregistrement inséré dans la base de données.


deux utilisateurs simultanés ajoutant le au modèle d'entreprise en même temps. ce n'est pas fiable car le 1er post pourrait obtenir l'id du 2ème si le timing est bon. la réponse acceptée est fiable.
Alex

@Alex veuillez vérifier, cela fonctionne et la meilleure solution pour obtenir le dernier identifiant inséré à partir des enregistrements.
Priyanka Patel

la solution mise à jour est très bien, mais elle nécessite plus de code que la réponse acceptée. Faire simplement $user->idsuffit après la création pour obtenir l'id inséré.
Alex

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

2
Ce message a reçu une réponse il y a 3 ans. Veuillez modifier votre réponse pour ajouter plus d'explications sur la raison pour laquelle cela pourrait aider l'utilisateur ou sur la manière dont son aide résout mieux la question du PO.
Syfer

1
Merci pour cet extrait de code, qui peut fournir une aide immédiate. Une explication appropriée améliorerait considérablement sa valeur éducative en montrant pourquoi il s'agit d'une bonne solution au problème, et la rendrait plus utile aux futurs lecteurs ayant des questions similaires, mais pas identiques. Veuillez modifier votre réponse pour ajouter des explications et donner une indication des limitations et hypothèses applicables. Sans parler de l'âge de la question et de la faible qualité de votre réponse.
GrumpyCrouton

-1

Utilisation d'un modèle éloquent

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;

}

Utilisation de Query Builder

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

Pour plus de méthodes pour obtenir l'ID de la dernière ligne insérée dans Laravel: http://phpnotebook.com/95-laravel/127-3-methods-to-get-last-instered-row-id-in-laravel


-1

Vous pouvez utiliser la $thisvariable constructeur pour obtenir le "dernier ID inséré à l'aide de Laravel Eloquent" (sans ajouter de colonne supplémentaire) dans la fonction ou le contrôleur actuel.

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

}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.