#システム概要
現在の日付から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
回答1件
あなたの回答
tips
プレビュー