Q&A
実現したいこと
- 親子関係で紐づいた子モデルのステータスを更新したい
前提
Laravel初心者です。現在Todoアプリを制作しています。
大目標(Todo)とそれを達成するための小目標(TodoList)があり、それぞれ親子関係になっています。
子モデルの小目標が達成されたときに完了ボタンを押すことでステータスが未完了(false)→完了(true)になるようにしたいです。
- Todo(親モデル)
- TodoList(子モデル)
- TodoList(子モデル)にstatusカラム(boolean型)が存在し、デフォルトはfalseになっています。
発生している問題・エラーメッセージ
完了ボタンを押した際下記のエラーが発生してしまいます。
エラーメッセージ
Attempt to assign property "status" on null
該当のソースコード
Todo.php
php
1<?php 2namespace App\Models; 3use Illuminate\Database\Eloquent\Factories\HasFactory; 4use Illuminate\Database\Eloquent\Model; 5 6class Todo extends Model 7{ 8 // リレーション 9 // ひとつの大目標(todo)はいくつかの小目標(todo_lists)を持つことができる 10 public function todo_lists() 11 { 12 return $this->hasMany('App\Models\TodoList'); 13 } 14 // リレーション 15} 16
TodoList.php
php
1<?php 2namespace App\Models; 3use Illuminate\Database\Eloquent\Factories\HasFactory; 4use Illuminate\Database\Eloquent\Model; 5 6class TodoList extends Model 7{ 8 use HasFactory; 9 10 // リレーション 11 // 小目標(todo_list)は一つの大目標(todo)を持つ 12 public function todo() 13 { 14 return $this->belongsTo('App\Models\Todo'); 15 } 16 // リレーション 17} 18
web.php
php
1<?php 2 3use App\Http\Controllers\ProfileController; 4use Illuminate\Support\Facades\Route; 5use App\Http\Controllers\TodoController; 6use App\Http\Controllers\TodoListController; 7 8// 小目標(todo_list)、大目標(todo)にネスト 9Route::resource('todos', TodoController::class); 10Route::resource('todo.todo_lists',TodoListController::class) 11
TodoListController.php
php
1<?php 2 3namespace App\Http\Controllers; 4use Illuminate\Http\Request; 5use App\Models\Todo; 6use App\Models\TodoList; 7 8 9class TodoListController extends Controller 10{ 11 12 public function update(Request $request, $id) 13 { 14 //該当データ検索 15 $todo_list = TodoList::find($id); 16 //ステータスを未完了(デフォルト)→完了 false:未完了 true:完了 17 $todo_list->status= true; 18 //データの保存 19 $todo_list->save(); 20 // 詳細画面のリダイレクト 21 return redirect()->route('todos.show',$todo_list->todo_id); 22 23 }
TodoController.php
php
1<?php 2namespace App\Http\Controllers; 3use Illuminate\Http\Request; 4use App\Models\Todo; 5use App\Models\User; 6use App\Models\TodoList; 7 8class TodoController extends Controller 9{ 10 public function show($id) 11 { 12 $todo= Todo::find($id); 13 $todo->todo_lists(); 14 return view('todos.show',compact('todo')); 15 } 16 17} 18
todos/show.blade.php
php
1@extends('layouts.app') 2@section('content') 3 4 <div class="container show_box"> 5 <h2 class="show_content_title">❗️やること❗️</h2> 6 <table> 7 //未完了タスクの表示 8 @foreach($todo->todo_lists as $todo_list) 9 @if($todo_list->status==false) 10 <tr> 11 <td>{{$todo_list->list_name}}</td> 12 //ステータスを更新 13 <td> 14 <form action="/todo/{{$todo->id}}/todo_lists/{{$todo_list->id}}" method="post"> 15 @csrf 16 @method('PUT') 17 <input type="hidden" name="status" value="{{$todo_list->status}}"> 18 <div class=green_button><button type="submit"><strong>完了</strong></button></div> 19 </form> 20 </td> 21 </tr> 22 @endif 23 @endforeach 24 </table> 25 26 27 <h2 class="devide_content_title">⭐️終わったこと⭐️</h2> 28 <table> 29 //完了タスクの表示 30 @foreach($todo->todo_lists as $todo_list) 31 @if($todo_list->status==true) 32 <tr> 33 <td>{{$todo_list->list_name}}</td> 34 <td>{{$todo_list->updated_at->format('Y-m-d')}}</td> 35 </tr> 36 @endif 37 @endforeach 38 </table> 39 </div><!--done_box--> 40 </div> 41 42@endsection
試したこと
親モデルのコントローラ(TodoController)のupdateメソッドに記載などしてみましたが
うまくいきませんでした。
原因が分からない為、ご教授頂ければと思います。
補足情報(FW/ツールのバージョンなど)
Laravel9
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2023/03/10 12:38