Call to a member function tasks() on null
#環境
PHP 7.3.11
Laravel Framework 5.8.38
#事象
TODOアプリを作成しております。
「仕事」というフォルダの中に「資料作成」や「会議」のようにタスクがあるような仕様です。
新規タスク作成画面でタスクを作成して、index画面に遷移すると掲題のエラーが出ます。
どこがnullになっているのか確認したところ、
TaskControllerのindexの$current_folderがnullとなっていることがわかりました。
ただ、なぜこの記述でnullになるのかが理解ができず解決にいたりません。
お力添えいただけますと助かります。
$current_folder = Folder::find($id['folder_id']);は試してみましたが、だめでした。
<?php
namespace App\Http\Controllers;
use App\Folder;
use App\Task;
use Illuminate\Http\Request;
use App\Http\Requests\CreateTask;
class TaskController extends Controller
{
public function create(int $id){
return view('tasks/create',['folder_id' => $id]);
}
public function store(int $id, CreateTask $request){
// 現在のフォルダを取得
$current_folder = Folder::find($id);
// 空のタスクインスタンスを生成し、リクエストを取得
$task = new Task();
$task->title = $request->title;
$task->due_date = $request->due_date;
// 現在のフォルダに生成したタスクを保存
$current_folder->tasks()->save($task);
return redirect()->route('tasks.index',['id' => '$current_folder->id']);
}
public function index($id){
// すべてのフォルダを取得する
$folders = Folder::all();
// 選ばれたフォルダを取得する
//$current_folderがnull
$current_folder = Folder::find($id);
// 選ばれたフォルダに紐づくタスクを取得する
$tasks = $current_folder->tasks()->get();
return view('tasks/index', [
'folders' => $folders,
'current_folder_id' => $current_folder->id,
'tasks' => $tasks,
]);
}
}
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Folder extends Model
{
public function tasks(){
return $this->hasMany('App\Task');
}
}
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Carbon\Carbon;
class Task extends Model
{
public function folder(){
return $this->belongsTo('App\Folder');
}
const STATUS = [
1 => [ 'label' => '未着手', 'class' => 'label-danger' ],
2 => [ 'label' => '着手中', 'class' => 'label-info' ],
3 => [ 'label' => '完了', 'class' => '' ],
];
/**
* 状態を表すHTMLクラス
* @return string
*/
public function getStatusLabelAttribute()
{
// 状態値
$status = $this->attributes['status'];
// 定義されていなければ空文字を返す
if (!isset(self::STATUS[$status])) {
return '';
}
return self::STATUS[$status]['label'];
}
/**
* 整形した期限日
* @return string
*/
public function getFormattedDueDateAttribute(){
return Carbon::createFromFormat('Y-m-d',$this->attributes['due_date'])->format('Y/m/d');
}
}
@extends('layout')
@section('content')
<div class="container">
<div class="row">
<div class="col col-md-4">
<nav class="panel panel-default">
<div class="panel-heading">フォルダ</div>
<div class="panel-body">
<a href="{{ route('folders.create') }}" class="btn btn-default btn-block">
フォルダを追加する
</a>
</div>
<div class="list-group">
@foreach($folders as $folder)
<a href="{{ route('tasks.index', ['id' => $folder->id]) }}" class="list-group-item {{ $current_folder_id === $folder->id ? 'active' : ''}}">
{{ $folder->title }}
</a>
@endforeach
</div>
</nav>
</div>
<div class="column col-md-8">
<div class="panel panel-default">
<div class="panel-heading">タスク</div>
<div class="panel-body">
<div class="text-right">
<a href="{{ route('tasks.create',['id' => $current_folder_id ])}}" class="btn btn-default btn-block">
タスクを追加する
</a>
</div>
</div>
<table class="table">
<thead>
<tr>
<th>タイトル</th>
<th>状態</th>
<th>期限</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach($tasks as $task)
<tr>
<td>{{ $task->title }}</td>
<td>
<span class="label {{ $task->status_class }}">{{ $task->status_label }}</span>
</td>
<td>{{ $task->formatted_due_date }}</td>
<td><a href="#">編集</a></td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</div>
@endsection