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

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

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

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

PHP

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

Q&A

1回答

726閲覧

Laravel セレクトボックスで選択したカテゴリの情報を送りたい

hanasaki

総合スコア3

Laravel

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

PHP

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

0グッド

0クリップ

投稿2023/03/02 03:55

実現したいこと

・セレクトボックスで選んだカテゴリの情報を新規作成のデータとして送りたい

前提

Laravel初心者です。
現在Todoアプリを作成しています。
新規作成の際に必要な情報は3つあり、プラン名、予定日、カテゴリで、このうちのカテゴリをセレクトボックスで選択し、データを送りたいのですがエラーになってしまいます。

発生している問題・エラーメッセージ

Method Illuminate\Http\Request::category does not exist.

該当のソースコード

Todo.php(モデル)

php

1<?php 2namespace App\Models; 3 4use Illuminate\Database\Eloquent\Factories\HasFactory; 5use Illuminate\Database\Eloquent\Model; 6 7class Todo extends Model 8{ 9 use HasFactory; 10 11 // リレーション 12 public function user() 13 { 14 return $this->belongsTo(User::class,'user_id'); 15 } 16 17 public function category() 18 { 19 return $this->belongsTo(Category::class,'category_id'); 20 } 21 22} 23

Category.php(モデル)

php

1<?php 2namespace App\Models; 3 4use Illuminate\Database\Eloquent\Factories\HasFactory; 5use Illuminate\Database\Eloquent\Model; 6 7class Category extends Model 8{ 9 use HasFactory; 10 11 // リレーション 12 public function todos() 13 { 14 return $this->hasMany(Todo::class,'category_id','id'); 15 } 16} 17

コントローラ TodoController.php(一部抜粋)

php

1 2namespace App\Http\Controllers; 3 4use Illuminate\Http\Request; 5 6use App\Models\Todo; 7use App\Models\Category; 8use App\Models\User; 9 10class TodoController extends Controller 11{ 12 public function create() 13 // 新規作成画面 14 { 15 $categories = Category::all(); 16 return view('todos.create', compact('categories')); 17 } 18 19 public function store(Request $request) 20 // 新規作成 21 { 22 $todo = new Todo; 23 $category = new Category(); 24 25 //データを割り当てる 26 $todo->title = $request->input('todo_title'); 27 $todo->due_date = $request->input('due_date'); 28 $todo->user_id = $request->user()->id; 29 $todo->category_id = $request->category()>id; 30 31 //保存 32 $todo->save(); 33 //リダイレクト 34 return redirect('/todos'); 35 } 36}

View(create.blade.php)

php

1<h2>まずはプランや目標を決めましょう!</h2> 2 3<form action="/todos" method="post"> 4 @csrf 5 6 <div class="plan_create"> 7 <label>プラン名</label><input placeholder="プランを入力してください" type="text" name="todo_title" /></br> 8 9  <label for="due_date">期限</label> 10 <input type="text" name="due_date" id="due_date" value="{{ old('due_date') }}" /></br> 11 12 <!-- カテゴリ選択 --> 13 <div class="form-group"> 14 <label for="category_id">{{ __('カテゴリー') }}</label> 15 <select class="form-control" id="category_id" name="category_name"> 16 @foreach ($categories as $category) 17 <option value="{{ $category->category_id }}">{{ $category->category_name }}</option> 18 @endforeach 19 </select> 20 </div> 21 <!-- カテゴリ選択 --> 22 23 </br><button>作成する</button> 24 </div> 25</form> 26

試したこと

コンローラのstoreメソッド
$todo->category_id = $request->category()>id;
の記述に問題がありそうなので
$todo->category_id = $request->category;
などしてみましたが、ダメでした。

categoryのidを選択してそれをcategory_idに送らなければならないと思うのですがどうすれば良いのかわかりませんでした。
理解不足で申し訳ありませんが、ご教授頂ければ幸いです。

補足情報(FW/ツールのバージョンなど)

Laravel9

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

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

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

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

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

guest

回答1

0

リクエストに含まれるのはその入力コントロールのname属性の属性値です。
(これはLaravel限らずPHP限らず、Webの仕様です)

<select class="form-control" id="category_id" name="category_name">

ですから、「category_name」で送信されているのでは?
リクエスト内容をダンプして確認してみてください。

投稿2023/03/02 03:59

m.ts10806

総合スコア80850

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

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

m.ts10806

2023/03/02 04:00

よく見たら $request->category()>id というのはオブジェクト的にも論外な記述だと思います。
hanasaki

2023/03/02 05:01

回答ありがとうございます。 リクエスト内容を確認してみたところ、確かにcategory_idが空(null)になっていました。 name属性をidに変更してみたのですが、やはり空になっていました... $request->category()->id;の部分にやはり問題があるようだとのことだったのですが、user_idが $request->user()->id;で取得できるのに対し、こちらはなぜ取得できないのでしょうか? 理解が浅くて申し訳ございません... リレーションで紐づいている情報を取得がよく分からない為、教えていただけると幸いです。
m.ts10806

2023/03/02 05:28 編集

ちなみにどのようにリクエスト内容を確認しましたか? あと、$request->input("id") とかでとれないんでしたっけ。(とりあえず取得するだけ)
m.ts10806

2023/03/02 05:19

あと命名がぶれると連携できない可能性があるのでname属性の属性値も カラム名とあわせたほうが良いと思います。
m.ts10806

2023/03/02 05:21

>$request->user()->id;で取得できるのに対し、こちらはなぜ取得できないのでしょうか? こちらについては、先に指摘したように「カラム名と一致するか」だと思います。 主とするテーブルとリレーション先のテーブルでカラム名が一致しない場合には注意が必要ですね。
hanasaki

2023/03/02 05:50

saveをかける前にdd($todo);でデバックを行なって確認しました。$category->id = $request->input("id");も記載してみましたが上手くいきませんでした...。 categoryのidを取得する場合、idカラムを取得するのでnameをidにするべきなのかと思ったのですが違うのでしょうか?色々質問してすみません!
m.ts10806

2023/03/02 06:22 編集

>saveをかける前にdd($todo);でデバック それはリクエストの確認ではなくsaveに送られるオブジェクトの確認です。 $request->all() $request->collect() などをdd()してみてください。 https://readouble.com/laravel/9.x/ja/requests.html > categoryのidを取得する場合、idカラムを取得するのでnameをidにするべきなのかと思ったのですが違うのでしょうか?色々質問してすみません 定義(DBとモデルの)次第です。 あとちょっと調べてみたのですが、 $request->user()->idで取得できるのは認証済みユーザー情報を $request->user()に持ってるからですね。いわゆるセッション的なもの。 https://readouble.com/laravel/9.x/ja/authentication.html#install-a-starter-kit category()は持ってないのでは(もちろん持つように実装すれば入るかもしれないが、おそらくコア弄る必要があるような)
hanasaki

2023/03/02 06:54

すみません!そうなのですね。勘違いしておりました。 $request->all ()でリクエストの確認ができました。name属性の属性値に設定した値が空でおくられていました。 (先ほどidにしていたのでid=nullになっていました。) >$request->user()->idで取得できるのは認証済みユーザー情報を $request->user()に持ってるからですね。いわゆるセッション的なもの なるほど。そうなのですね。リンクの記事もありがとうございます。 まだ上手くデータが送れていないのでここの記載をもう少し調べてみようと思います。
m.ts10806

2023/03/02 07:13

>リンクの記事 提示したのはLaravelの日本語訳ドキュメントなので最も公式に一番近いものです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問