🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Laravel

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

PHP

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

ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

Q&A

解決済

1回答

4755閲覧

(Laravel)ラジオボタンの値をDBから取得して編集したい

zlk1985

総合スコア5

Laravel

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

PHP

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

ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

0グッド

0クリップ

投稿2021/02/12 15:24

編集2021/02/13 02:41

#システム概要
現在の日付から1週間分の日付を取得して、データベースにデータがあればラジオボタンにチェックを入れる、データがなければ、ラジオボタンにチェックを入れないという仕様のスケジュール登録機能を実装しています。
現在は新規で登録することはできています。

#解決したいこと
データの有無判定をしつつ、常に1週間分の最新の日付で表示したいです。(7行だけ)

現在は欲しいデータは取れています。
そしてデータの有無の判定まではできていますが、viewでforとforeachを使っているため、すごい数の行が出力されます。

#コード

view

1<form action="/cast/mypage/schedule" method="POST"> 2 @csrf 3 <table class="w-100 mb-5"> 4 <tr class="text-center"> 5 <th width="70"></th> 6 <th width="70"><small>ダメ</small></th> 7 <th width="70"><small>OK</small></th> 8 <th width="70"><small>夜遅くはOK</small></th> 9 </tr> 10 11 //1週間の日付とラジオボタンを繰り返しで表示 12 @foreach($schedules as $schedule) 13 @for($i=0; $i<7; $i++) 14 15 <tr class="datelist text-center"> 16 <th class="" width="50"><small>{{ $week[$i] }}<input type="hidden" name="date_at[]" value="{{ $week[$i] }}"></small></th> 17 18  <td class=""><input type="radio" name="time_at[{{$i}}]" value="1" {{ $schedule->time_at == 1 ? 'checked' : ''}}></td> 19 <td class=""><input type="radio" name="time_at[{{$i}}]" value="2" {{ $schedule->time_at == 2 ? 'checked' : ''}}></td> 20 <td class=""><input type="radio" name="time_at[{{$i}}]" value="3" {{ $schedule->time_at == 3 ? 'checked' : ''}}></td> 21 </tr> 22 23 @endfor 24 @endforeach 25 </table> 26 27 <div class="profile-store"> 28 <input type="submit" value="保存する"class="btn btn-lg btn-block btn-primary align-items-center" /> 29 </div> 30</form> 31

controller

1<?php 2 3namespace App\Http\Controllers\Cast; 4 5use App\Http\Controllers\Controller; 6use Illuminate\Http\Request; 7use App\Models\Cast; 8use App\Models\CastAvailableDay; 9use Carbon\Carbon; 10//use Illuminate\Support\Facades\DB; 11 12class AvailableDayController extends Controller 13{ 14 /** 15 * Create a new controller instance. 16 * 17 * @return void 18 */ 19 public function __construct() 20 { 21 $this->middleware('auth:cast'); 22 } 23 24 //create画面でデータの登録と編集を一括で行いたい 25 public function create(){ 26     //ユーザーに紐づいたスケジュールを取得 27 $cast = auth()->user(); 28 $schedules = $cast->castAvailableDays; 29      30     //1週間分取得 31 $numOfDays = 7; 32 $dt = new Carbon(); 33 $format = 'YYYY-MM-DD'; 34 $week[0] = $dt->today()->isoFormat($format); 35 for ($i=1; $i < $numOfDays ; $i++) { 36 $week[$i] = $dt->copy()->addDay($i)->isoFormat($format); 37 } 38 return view('cast.mypage.schedule',['week'=>$week, 'schedules'=>$schedules]); 39 } 40 41 42 public function store(Request $request){ 43 44 // $schedules = $request->all(); 45 // unset($schedules['_token']); 46 47     //スケジュール新規登録の処理 48 foreach($request->date_at as $i => $val){ 49 $schedule = new CastAvailableDay; 50 $schedule->time_at = $request->time_at[$i]; 51 $schedule->cast_id = auth()->user()->id; 52 $schedule->date_at = $request->date_at[$i]; 53 $schedule->save(); 54 55 } 56 57 return redirect('/cast/mypage/schedule')->with('flash_message', '登録に成功しました'); 58 } 59} 60

model

1<?php 2 3namespace App\Models; 4 5use Illuminate\Database\Eloquent\Model; 6 7class CastAvailableDay extends Model 8{ 9 protected $fillable = [ 10 // 'id', 11 'cast_id', 12 'date_at', 13 'time_at', 14 // 'created_at', 15 // 'updated_at', 16 ]; 17 18 protected $casts = [ 19 'date_at' => 'date', 20 ]; 21 22 /** 23 * リレーション Cast >> CastImage 24 * 25 * @return App\Models\Cast 26 */ 27 public function cast() 28 { 29 return $this->belongsTo('App\Models\Cast', 'cast_id', 'id'); 30 } 31} 32

migration

1<?php 2 3use Illuminate\Database\Migrations\Migration; 4use Illuminate\Database\Schema\Blueprint; 5use Illuminate\Support\Facades\Schema; 6 7class CreateCastAvailableDaysTable extends Migration 8{ 9 /** 10 * Run the migrations. 11 * 12 * @return void 13 */ 14 public function up() 15 { 16 Schema::create('cast_available_days', function (Blueprint $table) { 17 $table->bigIncrements('id')->comment('対応可能日ID'); 18 $table->bigInteger('cast_id')->comment('ユーザーID'); 19 $table->date('date_at')->comment('日付'); 20 $table->integer('time_at')->default('0')->comment('時間帯'); 21 $table->timestamps(); 22 }); 23 } 24 25 26} 27

#環境
laravel6
php7.2

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

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

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

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

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

m.ts10806

2021/02/12 20:47

>現在のコードでデータベースにデータがあれば、ラジオボタンにチェック、データがなければ、ラジオボタンにチェックを入れないという仕様を実装できるものでしょうか? これが質問でしたら「出ている結果が全て」という回答になります。 できてないなら「実装できない」 できているなら「実装できている」 ひとまず「データベースのデータ」は正しく画面出力はできている(取得できている)状態ですか? 質問を整理されたほうが良いと思います。
m.ts10806

2021/02/12 20:50

いずれにしても checked が書かれてない時点で「できているわけがない」というのは分かります。
zlk1985

2021/02/13 02:42

ご指摘ありがとうございます。 質問内容の訂正をさせて頂きました。
guest

回答1

0

ベストアンサー

色々やり方はあるとは思うのですが、例えば以下のような感じはいかがでしょうか。

編集ビュー

php

1 {{-- 11行で表示 --}} 2 @foreach ($days as $i => $day) 3 <tr class="datelist text-center"> 4 <th class="" width="50"> 5 <input 6 type="hidden" 7 name="days[{{ $i }}][id]" 8 value="{{ $day->id }}" 9 > 10 <small> 11 {{ $day->date_at->format('Y-m-d') }} 12 <input 13 type="hidden" 14 name="days[{{ $i }}][date_at]" 15 value="{{ $day->date_at->format('Y-m-d') }}" 16 > 17 </small> 18 </th> 19 @foreach (range(1, 3) as $number) 20 <td class=""> 21 <input 22 type="radio" 23 name="days[{{ $i }}][time_at]" 24 value="{{ $number }}" 25 @if ($number == $day->time_at) checked @endif 26 > 27 </td> 28 @endforeach 29 </tr> 30 @endforeach

AvailableDayController

php

1 //編集ビューを表示する 2 public function edit(Request $request) 3 { 4 $start = today(); // 現在の日付 5 $end = today()->addDays(6); // 6日後 6 7 //ユーザーに紐づいたスケジュールを取得 8 $cast = auth()->user(); 9 $schedules = $cast->castAvailableDays() 10 ->whereBetween('date_at', [$start, $end]) 11 ->get(); 12 13 //スケジュールを準備 14 $days = []; 15 foreach ($start->toPeriod($end) as $date) { 16 $day = $schedules->firstWhere('date_at', $date); 17 if (!$day) { 18 $day = new CastAvailableDay(['date_at' => $date]); 19 } 20 $days[] = $day; 21 } 22 23 return view(編集ビュー, ['days' => $days]); 24 } 25 26 //更新する 27 public function update(Request $request) 28 { 29 $cast = auth()->user(); 30 31 //スケジュールを更新(または作成) 32 foreach ($request->days as $day) { 33 $cast->castAvailableDays()->updateOrCreate([ 34 'date_at' => $day['date_at'], 35 ], $day); 36 } 37 38 //更新後はリダイレクト 39 return ... 40 }

投稿2021/02/13 06:59

編集2021/02/13 07:24
Lulucom

総合スコア1899

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

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

zlk1985

2021/02/13 12:18 編集

ご回答ありがとうございます。 データベースから習得して、viewに反映まではできました。 更新あるいは登録で下記エラーが出ます。 「Undefined index: date_at」 dd($request->all())でデバックしてみるとdate_atが取れていなかったので、それが原因だと思われます。自分でも再度確認してみたいと思います。 【デバック内容】 "days" => array:7 [▼ 0 => array:2 [▼ "id" => null "time_at" => "1" ]
Lulucom

2021/02/13 13:09

そうですか・・・Bladeの次の部分にタイプミスなど無いでしょうか? name="days[{{ $i }}][date_at]"
zlk1985

2021/02/13 16:36

特にスペルミスなどは見あたりませんでした。。。 ctrl+Fで確認もしましたが、完全一致でした。。。
zlk1985

2021/02/13 16:44

すみません。。。 以下の日付表示用のjavascriptが効いて値が送られていないことが原因でした。 コメントアウトすることを失念しており、削除すると無事に動きました。 ご丁寧にありがとうございました! 自己解決できるよう頑張って勉強したいと思います。 <script> //現在の日時と曜日を取得 // $(function(){ // var now = new Date(); // var wd = ['日', '月', '火', '水', '木', '金', '土']; // $('.datelist small').text(function(){ // var m = now.getMonth()+1; // var d = now.getDate(); // var w = wd[now.getDay()]; // now.setDate(now.getDate()+1); // return m + "/" + d + "(" + w + ")"; // }); // }); </script>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問