

### エラー内容

以下のエラーが発生しました。

[code]

    Call to a member function tasks() on null
    
[/code]

### 状況

index.blade.phpにアクセスしようとしたところ以下のようなエラーが発生しました。  
index.blade.phpにアクセスするためにこのエラーを解決し、アクセスできるように実装したいと考えております。

今回のエラーに対して、調べてみて何個か仮説を立てたのですが、原因であろう箇所の対処がわからず解決の糸口が見つけられません。お手数ですが該当箇所に対するアプローチ等のアドバイスをお願いできたらと思い質問致しました。

**実装環境**  
Laravel Framework 8.21.0  
MariaDB 10.4.17 - mariadb.org binary distribution  
Windows 10

### エラーファイルと該当箇所

**TaskController.php**

[code]

    use App\Models\Task;    //なかったので追加
    use Illuminate\Http\Request;
    use App\Http\Requests\CreateTask;//CreateTaskコントローラをインポート
    
    class TaskController extends Controller
    {
    
        public function index($id)
        {
    
            //全てのフォルダを取得する
            $folders = Folder::all();
    
            //選ばれたフォルダを取得する
            $current_folder = Folder::find($id);
    
            // 選ばれたフォルダに紐づくタスクを取得する
            $tasks = $current_folder->tasks()->get(); // *エラーの該当箇所
    
        return view('tasks/index',[
            'folders' => $folders,
            'current_folder_id' => $current_folder->id,
            'tasks' => $tasks,
        ]);
    
    }
    
[/code]

### 自分の中で立てた仮説と結果

仮説⓵  
そもそもtasks関数が存在していない

`php artisan tinker` でデータベースの中身を調べたところ

[code]

    >>>App\Models\Task::find(1)
    >>>null
    
[/code]

しかし

[code]

    >>> App\Models\Task::find(3)
    => App\Models\Task {#4085
         id: 3,
         folder_id: 1,
         title: "サンプルタスク 1",
         due_data: "2021-01-14",
         status: 1,
         created_at: "2021-01-13 17:42:27",
         updated_at: "2021-01-13 17:42:27",
       }                                                                                                                  
    
[/code]

モデルファイルも確認でき、task関数がないという線はないと推定。

仮説②  
$current_folderの値がNULLである

→var_dumpの結果がNULLならオブジェクトの生成がうまくいっていない  
var dump($folders)の時点では値が取得できており  
$folders = Folder::all();のコードには恐らくコードに問題はないと推定

しかし `var_dump($current_folder);` してみたところ `$current_folder;` がNULLだった。  
`php artisan tinker` では以下の通り値が取得できている。

[code]

    >>> App\Models\Folder::find(1)
    => App\Models\Folder {#4087
         id: 1,
         title: "プライベート",
         created_at: "2021-01-13 17:42:20",
         updated_at: "2021-01-13 17:42:20",
       }
    
[/code]

**$current_folder = Folder::find($id);**  
恐らくこのコードに問題がありそうだが、具体的にどこに問題があるのか分からず...  
findメソッドで値が取れないのが疑問点です。

### 参考ファイル

**Folder.php**

[code]

    <?php
        
        namespace App\Models;
        
        use Illuminate\Database\Eloquent\Factories\HasFactory;
        use Illuminate\Database\Eloquent\Model;
        
        class Folder extends Model
        {
            public function tasks()
            {
                return $this->hasMany('App\Models\Task');
            }
        }
    
[/code]

**Task.php**

[code]

    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    // この行を追加
    use Carbon\Carbon;
    
    class Task extends Model
    {
        const STATUS = [
    
            1 => [ 'label' => '未着手', 'class' => 'label-danger' ],
            2 => [ 'label' => '着手中', 'class' => 'label-info' ],
            3 => [ 'label' => '完了', 'class' => '' ],
        ];
    
        public function getStatusLabelAttribute()
        {
            //状態値
            $status = $this->attributes['status'];
    
            // 定義されていなければ空文字を返す
            if (!isset(self::STATUS[$status])) {
                return '';
            }
    
            return self::STATUS[$status]['class'];
        }
    
        public function getFormattedDueDateAttribute()
        {
            return Carbon::createFromFormat('Y-m-d', $this->attributes['due_date'])
                ->format('Y/m/d');
        }
    }
    
[/code]

**web.php**

[code]

    <?php
    
    use Illuminate\Support\Facades\Route;
    
    /*
    |--------------------------------------------------------------------------
    | Web Routes
    |--------------------------------------------------------------------------
    |
    | Here is where you can register web routes for your application. These
    | routes are loaded by the RouteServiceProvider within a group which
    | contains the "web" middleware group. Now create something great!
    |
    */
    Route::get('/folders/{id}/tasks','TaskController@index')->name('tasks.index');
    
    Route::get('/folders/create', 'FolderController@showCreateForm')->name('folders.create');
    Route::post('/folders/create', 'FolderController@create');
    
    Route::get('/folders/{id}?tasks/create','TaskController@showCreateForm')->name('tasks.create');
    Route::post('/folders/{id}/tasks/create', 'TaskController@create');
    
[/code]

[DB内容]  
⓵foldersテーブル  
[![foldersテーブル](https://i.stack.imgur.com/JPxsi.png)](https://i.stack.imgur.com/JPxsi.png)  
[foldersテーブル]

[![foldersテーブルデータ構造](https://i.stack.imgur.com/xL1Ix.png)](https://i.stack.imgur.com/xL1Ix.png)  
[foldersテーブルデータ構造]

⓶tasksテーブル  
[![tasksテーブル](https://i.stack.imgur.com/4EOEA.png)](https://i.stack.imgur.com/4EOEA.png)  
[tasksテーブル]

[![tasksテーブルデータ構造](https://i.stack.imgur.com/cpWB9.png)](https://i.stack.imgur.com/cpWB9.png)  
[tasksテーブルデータ構造]


CC BY-SA 4.0
2021-01-21T23:19:43.753
73479
2021-01-22T02:41:12.013
2021-01-22T02:41:12.013
43620
43620
question
php laravel mariadb
Call to a member function tasks() on null のエラーを解決したい