質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Laravel

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

Q&A

解決済

1回答

5140閲覧

LaravelでのViewとcontrollerでのデータ受け渡しで「Attempt to read property "id" on int」のエラーが解消できない

teratail_masa

総合スコア2

Laravel

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

0グッド

0クリップ

投稿2022/05/07 10:13

https://www.hypertextcandy.com/laravel-tutorial-error-handling

こちらのサイトを参考にしながら、ポートフォリオ作成をしています。チュートリアルの(10)でつまずいています。

index.blade.phpの「タスクを追加する」を押した際にcreate.blade.phpで表題の「Attempt to read property "id" on int」エラーが出てしまいます。
(「a href="{{ route('tasks.create', ['folder' => $current_folder_id])}}"」を押した時です。)

自分で調べてみた結果、モデルのリレーションがうまくいっていないという記事がヒットしたため、Task.phpにbelogTo()を追加し、create.blade.phpのエラーが出た部分を「route('tasks.create', ['folder' => $folder->id]」から「route('tasks.create', ['folder' => $folder->taskToFolder->id]」にしてもみたのですが、同様に「Attempt to read property ">taskToFolder" on int」というエラーが出てしまいます。

やりたいこととしてはindex.blade.phpに表示されているフォルダ一覧(親)に関連付けられたタスク(子)を保存したく、index.blade.phpの「タスクを追加する」を押す→コントローラーのshowCreateFormメソッドが飛び出される→create.blade.phpに遷移→項目を入力し送信→コントローラーのcreateメソッドが呼び出される→index.blade.phpへリダイレクト
のような感じだと思うのですが、表題のエラーで前へすすめません、、
どなたかご教示いただけますと幸いです。よろしくお願いいたします。

TaskController.php

1<?php 2 3namespace App\Http\Controllers; 4 5use App\Models\Folder; 6use App\Http\Requests\CreateTask; 7use App\Http\Requests\EditTask; 8use App\Models\Task; 9use Illuminate\Http\Request; 10use Illuminate\Support\Facades\Auth; 11 12class TaskController extends Controller 13{ 14 /** 15 * タスク一覧 16 * @param Folder $folder 17 * @return \Illuminate\View\View 18 */ 19 public function index(Folder $folder) 20 { 21 // ★ ユーザーのフォルダを取得する 22 $folders = Auth::user()->folders()->get(); 23 24 // 選ばれたフォルダに紐づくタスクを取得する 25 $tasks = $folder->tasks()->get(); // ★ 26 27 return view('tasks/index', [ 28 'folders' => $folders, 29 'current_folder_id' => $folder->id, 30 'tasks' => $tasks, 31 ]); 32 } 33 34 35 /** 36 * タスク作成フォーム 37 * @param Folder $folder 38 * @return \Illuminate\View\View 39 */ 40 public function showCreateForm(Folder $folder) 41 { 42 // echo ('\n'); 43 // echo ('\n'); 44 // var_dump( 45 // $folder 46 // ); 47 return view('tasks/create', [ 48 // 'folder_id' => $folder->id, 49 'folder' => $folder->id, 50 ]); 51 } 52 53 /** 54 * タスク作成 55 * @param Folder $folder 56 * @param CreateTask $request 57 * @return \Illuminate\Http\RedirectResponse 58 */ 59 public function create(Folder $folder, CreateTask $request) 60 { 61 $task = new Task(); 62 $task->title = $request->title; 63 $task->due_date = $request->due_date; 64 65 $folder->tasks()->save($task); 66 67 return redirect()->route('tasks.index', [ 68 // 'id' => $folder->id, 69 'folder' => $folder->id, 70 ]); 71 } 72 73

create.blade.php

1<form action="{{ route('tasks.create', ['folder' => $folder->id]) }}" method="POST"> 2 @csrf 3 <div class="form-group"> 4 <label for="title">タイトル</label> 5 <input type="text" class="form-control" name="title" id="title" value="{{ old('title') }}" /> 6 </div> 7 <div class="form-group"> 8 <label for="due_date">期限</label> 9 <input type="text" class="form-control" name="due_date" id="due_date" value="{{ old('due_date') }}" /> 10 </div> 11 <div class="text-right"> 12 <button type="submit" class="btn btn-primary">送信</button> 13 </div> 14 </form>

web.php

1Route::group(['middleware' => 'auth'], function () { 2 3 4 Route::get('/', 'App\Http\Controllers\HomeController@index')->name('home'); 5 6 Route::get('/folders/create', 'App\Http\Controllers\FolderController@showCreateForm')->name('folders.create'); 7 Route::post('/folders/create', 'App\Http\Controllers\FolderController@create'); 8 9 Route::group(['middleware' => 'can:view,folder'], function () { 10 Route::get('/folders/{folder}/tasks', 'App\Http\Controllers\TaskController@index')->name('tasks.index'); 11 12 Route::get('/folders/{folder}/tasks/create', 'App\Http\Controllers\TaskController@showCreateForm')->name('tasks.create'); 13 Route::post('/folders/{folder}/tasks/create', 'App\Http\Controllers\TaskController@create'); 14 15 Route::get( 16 '/folders/{folder}/tasks/{task}/edit', 17 'App\Http\Controllers\TaskController@showEditForm' 18 )->name('tasks.edit'); 19 Route::post('/folders/{folder}/tasks/{task}/edit', 'App\Http\Controllers\TaskController@edit'); 20 }); 21}); 22Auth::routes();

index.blade.php

1@extends('layout') 2 3@section('content') 4 <div class="container"> 5 <div class="row"> 6 <div class="col col-md-4"> 7 <nav class="panel panel-default"> 8 <div class="panel-heading">フォルダ</div> 9 <div class="panel-body"> 10 <a href="{{ route('folders.create') }}" class="btn btn-default btn-block"> 11 フォルダを追加する 12 </a> 13 </div> 14 <div class="list-group"> 15 @foreach($folders as $folder) 16 <a href="{{ route('tasks.index', ['folder' => $folder->id]) }}" class="list-group-item {{ $current_folder_id === $folder->id ? 'active' : '' }}"> 17 {{ $folder->title }} 18 </a> 19 @endforeach 20 </div> 21 </nav> 22 </div> 23 <div class="column col-md-8"> 24 <!-- ここにタスクが表示される --> 25 <div class="panel panel-default"> 26 <div class="panel-heading">タスク</div> 27 <div class="panel-body"> 28 <div class="text-right"> 29 <a href="{{ route('tasks.create', ['folder' => $current_folder_id])}}" class="btn btn-default btn-block"> 30 タスクを追加する 31 </a> 32

Folder.php(モデル)

1<?php 2 3namespace App\Models; 4 5use Illuminate\Database\Eloquent\Factories\HasFactory; 6use Illuminate\Database\Eloquent\Model; 7 8class Folder extends Model 9{ 10 use HasFactory; 11 public function tasks() 12 { 13 return $this->hasMany('App\Models\Task', 'folder_id', 'id'); 14 } 15}

Task.php(モデル)

1<?php 2 3namespace App\Models; 4 5use Illuminate\Database\Eloquent\Factories\HasFactory; 6use Illuminate\Database\Eloquent\Model; 7use Carbon\Carbon; 8 9class Task extends Model 10{ 11 use HasFactory; 12 13 /** 14 * 状態定義 15 */ 16 const STATUS = [ 17 1 => ['label' => '未着手', 'class' => 'label-danger'], 18 2 => ['label' => '着手中', 'class' => 'label-info'], 19 3 => ['label' => '完了', 'class' => ''], 20 ]; 21 22 23 public function taskToFolder() 24 { 25 $this->belongsTo('\App\Models\Folder', 'folder_id', 'id'); 26 } 27 28 /** 29 * 状態のラベル 30 * @return string 31 */ 32 public function getStatusLabelAttribute() 33 { 34 // 状態値 35 $status = $this->attributes['status']; 36 37 // 定義されていなければ空文字を返す 38 if (!isset(self::STATUS[$status])) { 39 return ''; 40 } 41 42 return self::STATUS[$status]['label']; 43 } 44 45 46 /** 47 * 状態を表すHTMLクラス 48 * @return string 49 */ 50 public function getStatusClassAttribute() 51 { 52 // 状態値 53 $status = $this->attributes['status']; 54 55 // 定義されていなければ空文字を返す 56 if (!isset(self::STATUS[$status])) { 57 return ''; 58 } 59 60 return self::STATUS[$status]['class']; 61 } 62 63 /** 64 * 整形した期限日 65 * @return string 66 */ 67 public function getFormattedDueDateAttribute() 68 { 69 return Carbon::createFromFormat('Y-m-d', $this->attributes['due_date']) 70 ->format('Y/m/d'); 71 } 72} 73

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

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

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

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

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

guest

回答1

0

ベストアンサー

showCreateFormでは、'folder' => $folder->idと書いてあり、
create.blade.php$folderは整数なので、idは存在しません。

そのままcreate.blade.php$folder使う:<form action="{{ route('tasks.create', ['folder' => $folder]) }}" method="POST">
或いはTaskController.php@showCreateForm$folderオブジェクトを渡して、idを使うかですね:view('tasks/create',['folder' => $folder]);

投稿2022/05/07 10:32

skys215

総合スコア910

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

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

teratail_masa

2022/05/07 10:41 編集

後者のコントローラーを編集する方を試して見たところエラーの方が解消され、フォルダに基づいたタスク保存する機能実装することができました、、! 非常に助かりました。この度は大変ありがとうございました!   変更前 コントローラーにて view('tasks/create',['folder' => $folder->id]); ↓ 変更後 view('tasks/create',['folder' => $folder]);
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問