質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

5753閲覧

LaravelでDBへ新規保存後、insertしたIDを取得したい。

hiro_app

総合スコア123

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2021/04/01 09:23

編集2021/04/02 02:49

前提・実現したいこと

お世話になります。
LaravelでDBへ新規保存後にinsertしたIDを取得したいのですが、DBへの保存は成功していますがIDの取得結果が「0」になってしまいます。
いくつか試みたパターンと、デバッグ結果をコメントで記載いたします。(自分でもわけがわからなくなり、変な値アクセスもありますがご容赦ください)
対象のテーブルのIDは、通常の符号なし整数のAUTO_INCREMENTカラムです。

他に必要な情報がございましたら、追記していきますので、何卒ご教授の程、宜しくお願い致します。

試した保存パターン

MariaDB

1/* テーブルcreate文 */ 2CREATE TABLE `samples` ( 3 `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT 4 /* 以下、省略 */

Laravel

1// Laravel SampleController 2 $data = ['data' => 'hoge']; 3 4 // パターン1 5 $res = $this->sampleRepository->create($data); 6 dump($res->id); // 0 7 dump($res->lastInsertId); // null 8 dump($res->insertGetId); // null 9 exit; 10 11 // パターン2 12 $model = new Sample(); 13 $model->data = 'hoge'; 14 $res = $model->save(); 15 dump($res); // true 16 dump($model->id); // 0 17 dump($model->lastInsertId); // null 18 dump($model->insertGetId); // null 19 exit; 20 21 // パターン3 22 $res = DB::table('samples')->insert($data); 23 dump($res); // true 24 $res = DB::table('samples')->insertGetId($data); 25 dump($res); // "0" 26 $id = DB::getPdo()->lastInsertId(); 27 dump($id); // 0 28 exit; 29 30 // パターン4 31 $res = Sample::create($data); 32 dump($res->id); // 0 33 dump($res->lastInsertId); // null 34 dump($res->insertGetId); // null 35 exit;

ご指摘がありましたので、2回連続で保存を行ってみましたところ、2回目の処理だとIDが取得できていました。
上記サンプル時にも試していましたが、リロードしても同様の結果です。
下記サンプルでは、1回目のcreate結果が0、2回目のcreate結果がID取得となりました。
ただ、これでは2回保存を行っているので、片方は不要なデータになってしまいます。

Laravel

1 2 // パターン1 3 $res = $this->sampleRepository->create($data); 4 dump($res->id); // 0 5 $res2 = $this->sampleRepository->create($data); 6 dump($res2->id); // AUTO_INCREMENTのIDが取得できた! 7 exit;

補足情報

バージョン
Laravel Framework 6.11.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/04/01 10:10

連続で登録しても全部0ですか?
hiro_app

2021/04/01 10:32

ありがとうございます。 2回連続保存をすると、確かに2回目の保存時のみIDが取得できています! しかし、データが2重で登録されてしまいます。 この状態を防ぐ方法もあるのでしょうか? > あとinsertGetIdもlastInsertIdもプロパティではなくメソッドに思います。 ですよねー。 とりあえずエラーにならないなら色々書いて試していたもので。。。
m.ts10806

2021/04/01 11:01

存在しないプロパティを補完する機能もありますからね。 ドキュメント観てコピペするくらいがちょうどいいです。 >しかし、データが2重で登録されてしまいます。 この状態を防ぐ方法もあるのでしょうか? Auto Incrementですよね。PKにしかつけられなかったはずなので「2重で登録される」というのが意味わかりません。 どういうコードを書いてどういう結果になったのか具体的に質問本文に追記してください。
hiro_app

2021/04/02 02:49

大変失礼いたしました。 2回連続で保存したパターンのソースを追記いたしました。
hentaiman

2021/04/02 03:04

Sampleは普通のLaravelで一般的に使われているModelと同じものですよね?だとするともうちょっと全体のソースが無いと分かりませんね あっても分かるか知りませんが
guest

回答1

0

自己解決

保存後にIDが取得できるようになってしまいました。

ソース側は何も触っていないはずですが、突然挙動が変わってしまいました。
(バージョン管理も使用しているので、他の箇所を触った形跡も無し)

触ったと言えば「DBで作られたデータの1つを、ソフトウェア上から直接ID=999へ変更、その後戻す。」ということをしたぐらいでしょうか。

現象の再現ができなくなったため、調査が続行不可能となってしまいました。。。
(ありがたいと思う反面、原因が判明していないため、再度現象が発生しないか不安ですが)

取得できるようになったのは、下記ソースパターンです。

Laravel

1 // パターン1 2 $res = $this->sampleRepository->create($data); 3 dump($res->id); // IDが正常に取得

ありがとうございました。

投稿2021/04/02 09:18

hiro_app

総合スコア123

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問