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

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

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

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

解決済

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

teratail_masa
teratail_masa

総合スコア1

Laravel

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

1回答

0評価

0クリップ

220閲覧

投稿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

<?php namespace App\Http\Controllers; use App\Models\Folder; use App\Http\Requests\CreateTask; use App\Http\Requests\EditTask; use App\Models\Task; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class TaskController extends Controller { /** * タスク一覧 * @param Folder $folder * @return \Illuminate\View\View */ public function index(Folder $folder) { // ★ ユーザーのフォルダを取得する $folders = Auth::user()->folders()->get(); // 選ばれたフォルダに紐づくタスクを取得する $tasks = $folder->tasks()->get(); // ★ return view('tasks/index', [ 'folders' => $folders, 'current_folder_id' => $folder->id, 'tasks' => $tasks, ]); } /** * タスク作成フォーム * @param Folder $folder * @return \Illuminate\View\View */ public function showCreateForm(Folder $folder) { // echo ('\n'); // echo ('\n'); // var_dump( // $folder // ); return view('tasks/create', [ // 'folder_id' => $folder->id, 'folder' => $folder->id, ]); } /** * タスク作成 * @param Folder $folder * @param CreateTask $request * @return \Illuminate\Http\RedirectResponse */ public function create(Folder $folder, CreateTask $request) { $task = new Task(); $task->title = $request->title; $task->due_date = $request->due_date; $folder->tasks()->save($task); return redirect()->route('tasks.index', [ // 'id' => $folder->id, 'folder' => $folder->id, ]); }

create.blade.php

<form action="{{ route('tasks.create', ['folder' => $folder->id]) }}" method="POST"> @csrf <div class="form-group"> <label for="title">タイトル</label> <input type="text" class="form-control" name="title" id="title" value="{{ old('title') }}" /> </div> <div class="form-group"> <label for="due_date">期限</label> <input type="text" class="form-control" name="due_date" id="due_date" value="{{ old('due_date') }}" /> </div> <div class="text-right"> <button type="submit" class="btn btn-primary">送信</button> </div> </form>

web.php

Route::group(['middleware' => 'auth'], function () { Route::get('/', 'App\Http\Controllers\HomeController@index')->name('home'); Route::get('/folders/create', 'App\Http\Controllers\FolderController@showCreateForm')->name('folders.create'); Route::post('/folders/create', 'App\Http\Controllers\FolderController@create'); Route::group(['middleware' => 'can:view,folder'], function () { Route::get('/folders/{folder}/tasks', 'App\Http\Controllers\TaskController@index')->name('tasks.index'); Route::get('/folders/{folder}/tasks/create', 'App\Http\Controllers\TaskController@showCreateForm')->name('tasks.create'); Route::post('/folders/{folder}/tasks/create', 'App\Http\Controllers\TaskController@create'); Route::get( '/folders/{folder}/tasks/{task}/edit', 'App\Http\Controllers\TaskController@showEditForm' )->name('tasks.edit'); Route::post('/folders/{folder}/tasks/{task}/edit', 'App\Http\Controllers\TaskController@edit'); }); }); Auth::routes();

index.blade.php

@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', ['folder' => $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', ['folder' => $current_folder_id])}}" class="btn btn-default btn-block"> タスクを追加する </a>

Folder.php(モデル)

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

Task.php(モデル)

<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Carbon\Carbon; class Task extends Model { use HasFactory; /** * 状態定義 */ const STATUS = [ 1 => ['label' => '未着手', 'class' => 'label-danger'], 2 => ['label' => '着手中', 'class' => 'label-info'], 3 => ['label' => '完了', 'class' => ''], ]; public function taskToFolder() { $this->belongsTo('\App\Models\Folder', 'folder_id', 'id'); } /** * 状態のラベル * @return string */ public function getStatusLabelAttribute() { // 状態値 $status = $this->attributes['status']; // 定義されていなければ空文字を返す if (!isset(self::STATUS[$status])) { return ''; } return self::STATUS[$status]['label']; } /** * 状態を表すHTMLクラス * @return string */ public function getStatusClassAttribute() { // 状態値 $status = $this->attributes['status']; // 定義されていなければ空文字を返す if (!isset(self::STATUS[$status])) { return ''; } return self::STATUS[$status]['class']; } /** * 整形した期限日 * @return string */ public function getFormattedDueDateAttribute() { return Carbon::createFromFormat('Y-m-d', $this->attributes['due_date']) ->format('Y/m/d'); } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Laravel

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