前提・実現したいこと
PHP(Laravel)でレシピサイトを作っています。
ログイン済ユーザーがレシピに対してコメントを投稿できる機能を実装中です。
前提として、
1、ユーザー情報があるUsersテーブル
2、レシピ情報があるRecipesテーブル
3、レシピに対してユーザーごとにコメントを格納するCommentsテーブル(中間テーブル)
を用意しています。
実現したいのは
・各レシピに対して、ログイン済ユーザーであればコメントを投稿できる。
・コメントの一覧はログイン状態に関係なく閲覧できる
・レシピはどのユーザーがコメントを投稿したか紐づけできる
という3つの処理ですが、現状レシピ情報画面(show.blade.php)を表示すると、下記のエラーになります。
発生している問題・エラーメッセージ
上記機能を実装するために、どういった手順で修正していくのがよろしいでしょうか。
ご教授いただきたいです、よろしくお願いします。
ErrorException (E_ERROR) Trying to get property 'id' of non-object (View: /home/ec2-user/environment/recipe-site/resources/views/recipes/show.blade.php)
該当のソースコード
users_table
php
1<?php 2 3use Illuminate\Support\Facades\Schema; 4use Illuminate\Database\Schema\Blueprint; 5use Illuminate\Database\Migrations\Migration; 6 7class CreateUsersTable extends Migration 8{ 9 public function up() 10 { 11 Schema::create('users', function (Blueprint $table) { 12 $table->increments('id'); 13 $table->string('name'); 14 $table->string('email')->unique(); 15 $table->string('password'); 16 $table->rememberToken(); 17 $table->timestamps(); 18 }); 19 } 20 /*以下略*/ 21
recipes_table
php
1<?php 2 3use Illuminate\Support\Facades\Schema; 4use Illuminate\Database\Schema\Blueprint; 5use Illuminate\Database\Migrations\Migration; 6 7class CreateRecipesTable extends Migration 8{ 9 public function up() 10 { 11 Schema::create('recipes', function (Blueprint $table) { 12 $table->increments('id'); 13 $table->integer('user_id')->unsigned()->index(); 14 $table->timestamps(); 15 16 //外部キー 17 $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 18 }); 19 } 20 /*以下略*/ 21
user_comments.table
php
1<?php 2 3use Illuminate\Support\Facades\Schema; 4use Illuminate\Database\Schema\Blueprint; 5use Illuminate\Database\Migrations\Migration; 6 7class CreateUserCommentsTable extends Migration 8{ 9 10 public function up() 11 { 12 Schema::create('user_comments', function (Blueprint $table) { 13 $table->increments('id'); 14 $table->integer('recipe_id')->unsigned()->index(); 15 $table->integer('user_id')->unsigned()->index(); 16 $table->string('content'); 17 $table->timestamps(); 18 19 //外部キー 20 $table->foreign('recipe_id')->references('id')->on('recipes')->onDelete('cascade'); 21 $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 22 }); 23 } 24 /*以下略*/
web.php
php
1<?php 2 3//レシピの詳細画面表示 4Route::resource('recipes', 'RecipesController',['only' => ['show']]); 5 6//コメントの表示機能 7Route::get('comments','CommentsController@index'); 8 9//ログイン認証を必要とするルーティンググループ 10Route::group( ['middleware' => ['auth']], function(){ 11 12 //コメント投稿のルーティング 13 Route::resource('comments','CommentsController',['only' => ['store']]); 14 15}); 16
User.php
php
1<?php 2 3namespace App; 4 5use Illuminate\Notifications\Notifiable; 6use Illuminate\Foundation\Auth\User as Authenticatable; 7 8class User extends Authenticatable 9{ 10 //UserのRecipeを取得する 11 public function recipes() 12 { 13 return $this->hasMany(Recipe::class); 14 } 15 16 //UserのCommentを取得する 17 public function comments() 18 { 19 return $this->belongsToMany(Comment::class, 'user_comments', 'user_id', 'recipe_id')->withTimestamps(); 20 } 21 22}
Recipe.php
php
1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7class Recipe extends Model 8{ 9 10 //RecipeがどのUserに紐づいているか 11 public function user() 12 { 13 return $this->belongsTo(User::class); 14 } 15 16 public function comments() 17 { 18 return $this->belongsToMany(Comment::class, 'user_comments', 'user_id', 'recipe_id') 19 ->withTimestamps(); 20 } 21} 22
RecipesController.php
php
1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6 7use App\Recipe;//追加 8 9class RecipesController extends Controller 10{ 11 public function show($id) 12 { 13 //レシピデータを取得 14 $recipe = Recipe::find($id); 15 //ログイン済ユーザー 16 $user = \Auth::user(); 17 18 return view('recipes.show', [ 19 'recipe' => $recipe, 20 'user' => $user, 21 ]); 22 } 23
CommentsController.php
php
1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use App\Recipe; 7use App\User; 8 9class CommentsController extends Controller 10{ 11 12 //コメントの一覧表示処理 13 public function index() 14 { 15 16 $data = []; 17 18 //ログイン済かどうか 19 if(\Auth::check()){ 20 //ログイン済ユーザー 21 $user = \Auth::user(); 22 //ログインユーザーごとのコメントを格納 23 $comments = $user->comments()->orderBy('created_at', 'desc'); 24 25 $data = [ 26 'user' => $user, 27 'comments' => $comments, 28 ]; 29 } 30 //コメントをレシピ詳細画面に渡す 31 return view('recipes.show', $data); 32 33 } 34 //コメントの投稿処理 35 public function store(Request $request) 36 { 37 38 $request->user()->comments()->create([ 39 'content' => $request->content, 40 ]); 41 42 return back(); 43 }
show.blade.php
php
1@extends('layouts.app') 2 3@section('content') 4 <h1>レシピID:{{ $recipe->id }}の詳細ページ</h1> 5 <!--ログインユーザーのみ投稿可能--> 6 @if(Auth::id() == $user->id) 7 {!! Form::open(['route' => 'comments.store']) !!} 8 <div class="form-group"> 9 {!! Form::textarea('content',['class' => 'form-control']) !!} 10 {!! Form::submit('投稿', ['class' => 'btn btn-primary btn-block']) !!} 11 </div> 12 {!! Form::close() !!} 13 @endif 14 <!--投稿の表示処理--> 15 @if(count($comments) > 0) 16 @foreach($comments as $comment) 17 <p>{!! $comment->content !!}</p> 18 @endforeach 19 @endif 20@endsection
試したこと
多対多リレーションはこちらを参考にしました。
https://readouble.com/laravel/5.5/ja/eloquent-relationships.html#updating-many-to-many-relationships
補足情報(FW/ツールのバージョンなど)
PHP 7.2.22
Laravel 5.5
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/01/03 02:03
退会済みユーザー
2020/01/03 03:10
2020/01/08 13:03