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!

SoldierCorp
la source

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

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

Aamir
la source
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 ;
Majbah Habib
la source
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;
    }
}
Mujibur
la source
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);
}
ngakak
la source
15

Cela a fonctionné pour moi dans laravel 4.2

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

Par DB

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

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

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

Abhishek Goel
la source
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)
Tayyab Hussain
la source
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);
}
Réservoir HItesh
la source
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
la source
1

Tu peux le faire:

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

$lastInsertId=app('db')->getPdo()->lastInsertId();
Dnyaneshwar Harer
la source
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 = '[email protected]';
$data->save();
$lastInsertedId = $data->id;

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

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

dustypaws - Reinstate Monica
la source
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;
}
Rasheduzzaman
la source
0

Utilisation d'un modèle éloquent

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

Utilisation de Query Builder

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

Priyanka Patel
la source
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 
}
compte temporaire
la source
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

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

}
WebGhost
la source