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

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

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

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

Q&A

解決済

1回答

765閲覧

[laravel]ddで確認した値がDBに登録されない

marutto

総合スコア32

Laravel 5

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

0グッド

0クリップ

投稿2020/01/14 04:13

laravel5.8で本の感想投稿サイトを作っています。

POST送信された値をアクション内で加工してfillメソッドで登録しているのですが、
うまく登録できません。
fillを使う手前でddメソッドを使い、値が入っているのは確認したのですが、、、

具体的には、下記モデルの「user_id」が登録できません。

・storeアクション(リクエストデータを一部加工)

public function store(Request $request) // public function store(StoreImpressionsRequest $request) { // dd($request->all()); $message = $request->all(); if (Auth::check()) { $user_id = Auth::id(); $message += array('user_id' => $user_id); } // チェックボックスにチェックがない時はkey自体が存在しない if (isset($message['secret'])) { $message['secret'] = boolval($message['secret']); } dd($message); // データが入っているのを確認 Impression::create($message); return redirect('books.show', $request->book_id)->with('flash_message', '感想を投稿しました'); }

アクション内でuser_idを連想配列に追加、
ddメソッドで以下のように表示されます。
イメージ説明

そして、モデル内に定義したcreateメソッドをアクション内で実行しレコードを保存します。

・Impressionモデル

class Impression extends Model { protected $fillable = ['book_id', 'msg', 'secret',]; protected $guarded = []; // withメソッドでペアになってロードされる protected $with = ['book', 'user']; public static function create(array $attributes = []) { Log::debug($attributes); $model = new Impression($attributes); $model->save(); return $model; } // 以下略

これでレコードが新規作成されたのは確認できたのですが、DBではuser_idがnullになっています。
登録ユーザー以外も投稿できるようにしたいので、nullが入るケースがあること自体はいいのですが、ddメソッドで確認した値が記録されないのはなぜでしょうか?

アドバイスをいただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

$fillableにuser_idがないから。

それとは別にpublic static function create(array $attributes = [])はいらない。
Eloquentモデルにcreate()メソッドがあるのに勝手に作ってるのは意味がわからない。

コントローラーのImpression::create($message);だけ見たら普通なのに
このcreate()は勝手に作ったメソッドだったなんて意味不明なことされると他の人が困る。
create時にログを残したいならイベントを使えばいい。

投稿2020/01/14 04:52

kawax

総合スコア10377

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

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

marutto

2020/01/14 05:59

アドバイスありがとうございます! 教えていただいた通り、fillableにuser_idを入れて解決できました。 また、createメソッドの上書きも紛らわしく、他の方の迷惑になってしまいますね。 ご指摘いただいた通り、修正しようと思います。 ありがとうございました!。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問