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

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

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

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

3回答

709閲覧

laravel 5.2 インサートしたあとのidを取得したい

aoki_monpro

総合スコア45

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2018/08/07 10:50

編集2018/08/08 00:13

表題の通りなのですが、

フォームからPOST送信しmysql保存した後のid(インクリメントid)を取得したいのですが、
下記コードを実行すると、 mysql保存までは確認できるのですが、
dd表示が null表示になってしまいます。

いくつもググって見たのですが原因がわからず・・

ご知見ある方の助言をいただければ幸いです。

よろしくお願いいたします。

コントローラ

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Customer; use App\Http\Requests; public function store(Request $request) { $customer = new Customer(); $customer->customer_name = $request->customer_name; $customer->save(); $last_insert_id = $customer->id; dd($last_insert_id); }

2018/08/08追記
コメント頂いた内容を試してみました。

・変数無しで dd($last_insert_id);
→ null

・$customerを取得

dd($customer->toArray()); array:5 [▼ "customer_name" => "test0902" "visible_flag" => 1 "updated_at" => "2018-08-08 09:02:26" "created_at" => "2018-08-08 09:02:26" "customer_id" => 54 ]

指定していないcustomer_id が含まれていたのでプログラムどこか間違っていそうです。。

migration

1 public function up() 2 { 3 Schema::create('customers', function (Blueprint $table) { 4 $table->increments('id'); 5 $table->integer('customer_id'); 6 $table->string('customer_name'); 7 $table->boolean('visible_flag'); 8 $table->integer('sortNo'); 9 $table->timestamps(); 10 }); 11 }

model

class Customer extends Model { // protected $primaryKey = "customer_id"; // public function tasks() { return $this->hasMany('App\Task'); } }

テーブル

mysql

1show columns from customers; 2 3+---------------+------------------+------+-----+---------+----------------+ 4| Field | Type | Null | Key | Default | Extra | 5+---------------+------------------+------+-----+---------+----------------+ 6| id | int(10) unsigned | NO | PRI | NULL | auto_increment | 7| customer_id | int(11) | NO | | NULL | | 8| customer_name | varchar(255) | NO | | NULL | | 9| created_at | timestamp | YES | | NULL | | 10| updated_at | timestamp | YES | | NULL | | 11| visible_flag | tinyint(1) | YES | | NULL | | 12| sort_no | int(11) | YES | | NULL | | 13+---------------+------------------+------+-----+---------+----------------+

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

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

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

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

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

m.ts10806

2018/08/07 13:39

$customer->idを変数に受けずにそのままdd()しても同じ結果ですか?
lightwill

2018/08/07 15:49

普通それでとれるはず。customerテーブルにidってカラムがないとか?dd($customer->toArray())で何が入っているか確認してみれば?
aoki_monpro

2018/08/08 00:14

>mts1086様 そのままdd() してもnull表示になりました。
aoki_monpro

2018/08/08 00:15

>lightwill様 dd($customer->toArray()) 試したところ、idはなく、customer_id が表示されておりました。idがインクリメントで customer_idはリレーション用なのですが、 インクリメントされるはずのidが含まれていないようです。プログラム間違っていそうなので探してみます。
guest

回答3

0

ベストアンサー

laravelで扱えるテーブルのプライマリーキーは、

・カラム名が「id」
・自動採番される
・整数値

が、基本です。

で、Customer Model の設定ですが、

php

1protected $primaryKey = "customer_id";

これは、
プライマリーキーのカラム名を id ではなく、customer_idにします
という設定です。。。

この指定した場合、カラムidは取得対象から除外されます。
(「idというカラムがなく、別のカラムをプライマリーキーに使いたい」といった目的で、この指定をするのが主なので・・・)

なので、save後に保持される筈のプライマリーキーも、idではなく、customer_idを取得します。

もし、idの値が勝手にcustomer_idに入っている、というのであれば、
どうしてそうなるのか、提示されているコードだけでは判別できないと思います。

saveした結果、DB上でのcustomersテーブル中身はどうなっているのでしょうか?

そもそもの話、テーブル定義を見る限り、customer_name のみの指定では、Not nullのカラムがあるので、insertできないと思うのですが、saveしている部分のコードはこれで全部ですか・・??

投稿2018/08/08 01:36

mix-peach

総合スコア1910

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

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

aoki_monpro

2018/08/08 01:46

コメントありがとうございます。 プライマリーキーをidに変更し、無事保存できました。 リレーションのためプライマリーキーを変えていた記憶なのですが、半年前に設定したものでちょっとうる覚え・・ DB上のcustomerテーブルは、id に数値、customer_idは0、 customer_nameは入力値、created_at, updated_at は入力され、visible_flagは1, sort_no はnull になっています。 saveしている部分のコードはこれで全部です、insertできちゃってるのが謎ですね・・
guest

0

migrationを見るとauto_incrementされる主キーがidというカラムになっていますが、モデル側のCustomerクラスでprotected $primaryKey = "customer_id";と誤って別のカラムを指定しているのでおかしくなっているのだと思います。

$primaryKey"id"と正しく指定するか、$primaryKeyプロパティの設定自体を削除してください。(設定のないときのデフォルトはidなのでこの場合なら設定は不要です)

投稿2018/08/08 01:49

crhg

総合スコア1175

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

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

aoki_monpro

2018/08/08 02:02

コメントありがとうございます。 うる覚えですが、リレーションでcustomer_id で紐づけする際、誤った理解で $primayKey を設定必要と思い込んだのだと思います。 変えるなら migration側も主キー変える必要あるということですね、ご指摘ありがとございます、勉強になります。
guest

0

Laravel5.5以降しか経験ないのですが、

protected $primaryKey = "customer_id";

これが原因では?

protected $primaryKey = "id";

としたらどうなるでしょう?

投稿2018/08/08 01:18

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

aoki_monpro

2018/08/08 01:48

コメントありがとうございます、idに切り替えて実行できました。 プライマリーキーを設定した意図を忘れてしまっていたので、こちらで運用確認してみます。 重ねてありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問