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

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

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

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

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

PHP

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

Q&A

解決済

1回答

269閲覧

LaravelでDBに入っている学年とユーザーが選択した学年が一致したときに科目を表示させたい

makiharajin_74

総合スコア17

Laravel

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

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

PHP

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

0グッド

0クリップ

投稿2024/06/03 01:50

実現したいこと

Laravel MVC を使用

1,ユーザーが学年を選択
2,選択した学年がDBの中に入っている学年と比較する
3,一致してればその対象の授業のタイトルを表示させる。

発生している問題・分からないこと

DBの値とユーザーが選択した値を一致させる方法を知りたい。
また、ユーザー選択画面では学年ごとに別々の科目が授業されるようにしたい。

該当のソースコード

curriculums_list

1<div class="container"> 2 <div class="buttons"> 3 <button onclick="showSubjects('grade1')">小学校1年生</button> 4 <button onclick="showSubjects('grade2')">小学校2年生</button> 5 <button onclick="showSubjects('grade3')">小学校3年生</button> 6 <button onclick="showSubjects('grade4')">小学校4年生</button> 7 <button onclick="showSubjects('grade5')">小学校5年生</button> 8 <button onclick="showSubjects('grade6')">小学校6年生</button> 9 <button onclick="showSubjects('grade7')">中学校1年生</button> 10 <button onclick="showSubjects('grade8')">中学校2年生</button> 11 <button onclick="showSubjects('grade9')">中学校3年生</button> 12 <button onclick="showSubjects('grade10')">高校1年生</button> 13 <button onclick="showSubjects('grade11')">高校2年生</button> 14 <button onclick="showSubjects('grade12')">高校3年生</button> 15 </div> 16 17 <div id="subjects-container"> 18 <!-- 科目リストがここに表示されます --> 19 </div> 20 21 </div>

js

1const subjects = ['国語', '数学', '社会', '理科', '英語', '体育']; 2 3function showSubjects(grade) { 4 const subjectsContainer = document.getElementById('subjects-container'); 5 subjectsContainer.innerHTML = ''; 6 7 // const gradeTitle = document.createElement('h2'); 8 // gradeTitle.textContent = gradeToTitle(grade); 9 // subjectsContainer.appendChild(gradeTitle); 10 11 const subjectsList = document.createElement('ul'); 12 subjectsList.className = 'subjects'; 13 14 subjects.forEach(subject => { 15 const listItem = document.createElement('li'); 16 listItem.textContent = subject; 17 subjectsList.appendChild(listItem); 18 }); 19 20 subjectsContainer.appendChild(subjectsList); 21 22 const p_title_id = document.getElementById('p_title'); 23 p_title_id.innerHTML = ''; 24 const p_title = document.createElement('p'); 25 p_title.textContent = gradeToTitle(grade); 26 p_title_id.appendChild(p_title); 27 p_title.classList.add('p_style'); 28} 29 30 31 32 33function gradeToTitle(grade) { 34 const titles = { 35 grade1: '小学校1年生', 36 grade2: '小学校2年生', 37 grade3: '小学校3年生', 38 grade4: '小学校4年生', 39 grade5: '小学校5年生', 40 grade6: '小学校6年生', 41 grade7: '中学校1年生', 42 grade8: '中学校2年生', 43 grade9: '中学校3年生', 44 grade10: '高校1年生', 45 grade11: '高校2年生', 46 grade12: '高校3年生', 47 }; 48 return titles[grade]; 49} 50

Curriculum(Model)

1class Curriculum extends Model 2{ 3 use HasFactory; 4 5 protected $fillable = [ 6 'title', 7 'thumbnail', 8 'description', 9 'video_url', 10 'alway_delivery_flg', 11 'grade_id', 12 ]; 13public function storeCurriculum($grade , $request) 14 { 15 //授業データを保存 16 $curriculums = new Curriculum(); 17 $curriculums->title = $request->input('title'); 18 19 //ここにサムネイル画像を入れる 20 // 商品画像を保存 21 if ($request->hasFile('thumbnail_image')) { 22 23 return back()->with('error', 'ファイルがアップロードされていません'); 24 $imagePath = $request->file('thumbnail_image')->store('images', 'public'); 25 $curriculums->thumbnail = $imagePath; 26 } 27 28 $curriculums->description = $request->input('description'); 29 $curriculums->video_url = $request->input('video_url'); 30 $curriculums->alway_delivery_flg = $request->boolean('alway_delivery_flg'); 31 $curriculums->grade_id = $request->input('grade_id'); 32 33 $curriculums->save(); 34 return $curriculums; 35 } 36}

Curriculum_List(controller)

1class Curriculum_List extends Controller 2{ 3 //授業一覧-画面 4 public function showCurriculum_List(Request $request) 5 { 6 $deliverytimes = Delivery_time::all(); 7 $model = new Curriculum(); 8 $curriculums = $model->getCurriculum(); 9 return view('curriculums_list\curriculums_list' , compact('curriculums' , 'deliverytimes')); 10 } 11} 12

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

イメージ
授業入力フォームで登録→DBに保存
授業一覧画面でユーザーが学年を選択
選択された学年とDBに入っている学年を比較する。
一致していればDBのテーブルの授業タイトルを授業一覧画面のユーザーが選択した学年の画面で表示。

チャットGPTより
ファイルを二つ作成
1,入力フォーム専用のファイル→授業一覧画面の学年を選択するファイル
2,出力専用のファイル→比較した結果を表示させるファイル

ただ、ファイルが複雑になることが懸念点。

補足

イメージ説明

イメージ説明

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

サーバサイド、フロントエンドで絞る2通りの方法がありますが、この場合はサーバサイド(コントローラ)でやるのが良いと思います。

サーバサイドで絞る

まずフロントはButtonの箇所をaタグに変更します。

php

1<div class="buttons"> 2 <a href="{{ route('kono.page', ['grade_id'=>1]) }}">小学校1年生</a> 3 <a href="{{ route('kono.page', ['grade_id'=>2]) }}">小学校2年生</a> 4 <a href="{{ route('kono.page', ['grade_id'=>3]) }}">小学校3年生</a> 5 <a href="{{ route('kono.page', ['grade_id'=>4]) }}">小学校4年生</a> 6 <a href="{{ route('kono.page', ['grade_id'=>5]) }}">小学校5年生</a> 7 <a href="{{ route('kono.page', ['grade_id'=>6]) }}">小学校6年生</a> 8 <a href="{{ route('kono.page', ['grade_id'=>7]) }}">中学校1年生</a> 9 <a href="{{ route('kono.page', ['grade_id'=>8]) }}">中学校2年生</a> 10 <a href="{{ route('kono.page', ['grade_id'=>9]) }}">中学校3年生</a> 11 <a href="{{ route('kono.page', ['grade_id'=>10]) }}">高校1年生</a> 12 <a href="{{ route('kono.page', ['grade_id'=>11]) }}">高校2年生</a> 13 <a href="{{ route('kono.page', ['grade_id'=>12]) }}">高校3年生</a> 14</div>

route('')の中身はweb.phpで定義してるnameに置き換えてください。

そうするとクリックしたとき、 example.com/hogehoge?grade_id=1 に飛ぶようになるので、このgrade_idをコントローラで取得します。

コントローラは次のように変更します。
$requestの中身に、?grade_idのパラメータが格納されているのでそれを利用して、
DBからカリキュラムを取得する際に絞り込みます。

php

1class Curriculum_List extends Controller 2{ 3 //授業一覧-画面 4 public function showCurriculum_List(Request $request) 5 { 6 $deliverytimes = Delivery_time::all(); 7 8 $query = Curriculm::query(); 9 // 学年で絞り込み 10 if($request->input('grade_id')){ 11 $query->where('grade_id', $request->input('grade_id')); 12 } 13 $curriculums = $query->get(); 14 15 return view('curriculums_list\curriculums_list' , compact('curriculums' , 'deliverytimes')); 16 } 17} 18

↓この箇所で、DBにあるカリキュラムのgrade_idと、クリックされてURLに追加された grade_id=*** の部分が一致するもののみに絞ります。
$query->where('grade_id', $request->input('grade_id'));

フロントで絞る

深く考えていないので手法だけ書くと

  • 科目のリスト要素に適当なクラスかdata属性をつける
<div class="curriculum grade1">授業1</div> <div class="curriculum grade1">授業2</div> <div class="curriculum grade2">授業3</div>
  • ボタンがクリックされた時、全て非表示にし、選択されたgrade*のみ表示する

javascript

1$('.curriculum').hide(); 2$('.grade2').show();

これで選択されたものだけ残ります。

さらに改善するには

ボタンの箇所もDBから引っ張ります。

php

1<!-- コントローラで$gradesを取得しておいて --> 2<div class="buttons"> 3 @foreach($grades as $grade) 4 <a href="{{ route('kono.page', ['grade_id'=> $grade->id]) }}">{{ $grade->name }}</a> 5 @endforeach 6</div>

この方が不整合が出にくく、考慮しておくエラーが少なく済みます。

サーバサイドで絞るように実施できれば、主に以下のようなメリットがあります。

  • (JSに比べ)PCに読み込むデータ数が減る
  • データ数が大量になった場合にページネーションが使える

上記フロントで絞る方法のような、フロントで表示・非表示を切り替えることもできますが、
DB(sql)やPHPで絞る方が何倍も早いというのがPHPの基本的な考え方になります。

投稿2024/06/13 18:19

sk_

総合スコア92

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問