Laravel Eloquentを使用して最後に挿入されたIDを取得する


294

現在、次のコードを使用してテーブルにデータを挿入しています。

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

最後に挿入されたIDを返したいのですが、取得方法がわかりません。

敬具!

回答:


378

の保存$data->id最後のIDが挿入されなければなりません。

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

このように使用できます。

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

更新されたlaravelバージョンについては、これを試してください

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

2
オブジェクトは常にオブジェクトofcを返します。これが唯一の方法です。
Cas Bloem 2014年

40
idが自動インクリメントでない場合、これは常にを返すことに注意してください0。私の場合、IDは文字列(UUID)であり、これを機能させるにpublic $incrementing = false;は、モデルに追加する必要がありました。
ルイス・クルーズ

2
@milzという名前のカスタムフィールドのuuidを生成するMySQLトリガーがあり、aid設定しました$incrementing = false;が、それも返されません!
SaidbakR 2017

@SaidbakRは真実ですが、この非常に重要な情報を入手したLaravelドキュメントのセクションを教えていただけますか?
Damilola Olowookere、

@DamilolaOlowookereこれは、Laravel 5.4を使用するアプリケーションで見つけたものです。
SaidbakR

121

この場合はxdazzが適切ですが、DB::statementまたはを使用する可能性のある将来の訪問者のために、DB::insert別の方法があります。

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

43
実際、あなたはインサートでそれを正しく行うことができます$id = DB::table('someTable')->insertGetId( ['field' => Input['data']);
ケーシー

1
@Caseyがこの方法でこれを行うと、DBのタイムスタンプは更新されません
Rafael

@Rafael、timestampsを使用して更新したい場合はinsertGetIdこちらを
Frank Myat Thu

まさに先日探していたもの!また、insertGetIdid列が実際に「id」と呼ばれる場合にのみ機能します。
キャプテンハイパーテキスト2016

@Benubird、私はあなたの答えに従って私の解決策を持っています。
Bhavin Thummar

58

Jeffrey WayがModel::create()Laracasts 5のチュートリアルでどのように使用するかを好む人にとっては、コントローラーの各フィールドを明示的に設定せずにリクエストをデータベースに直接送信し、モデルの$fillableを質量割り当てに使用します(非常に重要です。この方法):私は多くの人が使用しているのを読みましたinsertGetId()が、残念ながらこれは$fillableホワイトリストを尊重していないため、_tokenを挿入しようとするとエラーが発生し、データベース内のフィールドではないものは、最終的に必要なものに設定されますフィルターなど。大量の割り当てを使用し、可能な場合は全体的に少ないコードを記述したいので、私は困惑しました。幸い、Eloquentのcreateメソッドは、saveメソッド(@xdazzが上で引用したもの)をラップするだけなので、最後に作成されたIDを引き続きプルできます...

public function store() {

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

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

2
この例では5.1に私のために動作しませんでしたが、これはやった:を$new = Company::create($input); return redirect('company/'.$new->id);
timgavin

2
これは、要求フィールド名がそれぞれのデータベース列と同じであることを前提としています。必ずしもそうではありません(例えば、レガシーコード)..
mosid

48

テーブルに自動インクリメントIDがある場合は、insertGetIdメソッドを使用してレコードを挿入し、IDを取得します。

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

参照:https : //laravel.com/docs/5.1/queries#inserts


あなたが説明したものは、Fluentを使用して最後の挿入をキャプチャするように見えます。質問はEloquentについてでした。$ id = Model :: create( 'votes' => 0])-> id;のようになります。上記のこの回答で説明したとおり:stackoverflow.com/a/21084888/436443
Jeffz

46

**** Laravelの場合****

最初にオブジェクトを作成し、次にそのオブジェクトの属性値を設定し、次にオブジェクトレコードを保存して、最後に挿入されたIDを取得します。といった

$user = new User();        

$user->name = 'John';  

$user->save();

//最後に挿入されたIDを取得しています

$insertedId = $user->id;

echo $insertedId ;

16

laravel 5では、これを行うことができます:

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

次に例を示します。

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

これはlaravel 4.2で私のために働きました

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

11

Laravel 4で最後に挿入されたIDを取得する方法は次のとおりです

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

insertGetId挿入と挿入idを同時に行うために使用します

ドキュメントから

テーブルに自動インクリメントIDがある場合は、insertGetIdメソッドを使用してレコードを挿入し、IDを取得します。

沿って Model

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

沿って DB

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

詳細:https : //laravel.com/docs/5.5/queries#inserts


6

モデルを保存すると、初期化されたインスタンスは次の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

以下のためのインサート()

例:

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

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

3

Laravel 5.2では、可能な限りクリーンにします。

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

3

$data->save()

$data->id 挿入されたIDが表示されます

注:自動インクリメントの列名がsnoの場合は、使用する必要が$data->snoあります。 $data->id


2

の保存、データベース内のレコードを、あなたがアクセスできるIDを$data->id

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

2

Laravelの場合、新しいレコードを挿入して$data->save()この関数を呼び出すと、INSERTクエリが実行され、主キーの値(デフォルトではid)が返されます。

次のコードを使用できます。

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

データベースに最後に挿入されたIDを取得するために使用できます

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

ここで$ lastInsertedIdは、最後に挿入された自動インクリメントIDを提供します。


1

最短の方法はおそらくrefresh()モデルのの呼び出しです:

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

1

この質問は少し古いですが。私の迅速で汚い解決策は次のようになります:

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

しかし、非常に頻繁なデータベースでの競合状態に対して脆弱であると思います。


1
ありがとう!これはパイプラインで使用できます。したがって、競合状態や美しいコードについて心配する必要はありません。
Daantje

1

次のように試すこともできます:

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

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

0

雄弁なモデルの使用

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

クエリビルダーの使用

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

0

保存後$data->save()。すべてのデータは内部にプッシュされ$dataます。これはオブジェクトであり、現在の行は最近に保存されたばかり$dataです。だから最後insertIdはの中にあり$data->idます。

応答コードは次のようになります。

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


0

saveメソッドを呼び出すのと同じオブジェクトで最後に挿入されたIDを取得できます。

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

だからあなたは単に書くことができます:

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

0

最後に挿入されたレコードIDを簡単にフェッチできます

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

DBに最後に挿入されたレコードからIdをフェッチするのは素晴らしいトリックです。


同時に会社モデルに追加する2人の同時ユーザー。タイミングが正しい場合、最初の投稿が2番目のIDを取得する可能性があるため、これは信頼できません。受け入れられた答えは信頼できます。
アレックス

@Alexは親切にチェックします。これは機能しており、レコードから最後に挿入されたIDを取得するための最良のソリューションです。
Priyanka Patel

更新されたソリューションは問題ありませんが、受け入れられた回答よりも多くのコードが必要です。単純にやっては$user->id挿入されたIDを取得するために作成した後に十分です。
アレックス

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

2
この投稿は3年前に回答されました。回答を編集して、なぜそれがユーザーに役立つか、またはそれがOPの質問をより適切に解決するのにどのように役立つかについての説明を追加してください。
Syfer、2017

1
このコードスニペット、ありがとうございます。適切な説明は、なぜこれが問題の良い解決策であるかを示すことにより、教育的価値を大幅に改善し、同じではないが同じ質問をする将来の読者にとってより有用になります。回答を編集して説明を追加し、適用される制限と前提を示してください。質問の年齢と回答の質の低さは言うまでもありません。
GrumpyCrouton 2017

-1

雄弁なモデルの使用

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;

}

クエリビルダーの使用

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

Laravelで最後に挿入された行IDを取得するその他の方法については、http//phpnotebook.com/95-laravel/127-3-methods-to-get-last-inserted-row-id-in-laravel


-1

$thisコンストラクター変数を使用して、現在の関数またはコントローラーで(Laravel Eloquentを使用した最後に挿入されたID)(追加の列を追加せずに)を実現できます。

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

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.