前提・実現したいこと
PHP laravelのフレームワークでシンプルな掲示板を作成しています。
一つの投稿に対して複数コメントを出来るように実装したいと考えています。
参考はこちらの記事の方の方法を参考にしました。
https://blog.hiroyuki90.com/articles/laravel-bbs/
ただもともと投稿を出来る画面をはじめに作っていたのでそこに追加する形で実装しようとしています。
Seederなどは使わず進めています。
発生している問題・エラーメッセージ
投稿された内容とコメントのデータを取得しviewに表示させる段階を作っています。
hasMany()とbelongsTo()を使用しモデル、migrationファイルの連携をし、
投稿された内容を写すことは出来たのですが、投稿に対してのコメントを表示させようとviewファイルに変数を書き込むと下記のようなエラーが出てしまいます。
ErrorException (E_ERROR)
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'comments.talk_id' in 'where clause' (SQL: select * from comments
where comments
.talk_id
= 2 and comments
.talk_id
is not null) (View: /home/ec2-user/environment/talkroom/resources/views/talkroom/index.blade.php)
上記のエラーを見ると恐らくtalk_idというカラムが存在していないと認識したのですが、talk_idというカラムは定義しておらずmysqlで確認してもありませんでした.
投稿のデータを保存するTalk modelのidとコメントのデータを保存するComment modelのpost_idを上手く繋げたいのですが、どのあたりに間違いがあるのか調べてもなかなか解決しなかったのでこちらで質問させていただきます。
お手数ですが宜しくお願い致します。
足りない情報があれば追記していきますので併せて宜しくお願い致します。
該当のソースコード
##migration file
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; use App\Talk; class CreateCommentsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('comments', function (Blueprint $table) { $table->increments('id'); $table->integer('post_id')->unsigned(); $table->string('name')->nullable(); $table->text('body'); $table->timestamps(); $table->foreign('post_id')->references('id')->on('talks'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('comments'); } }
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; use App\Comment; class CreateTalksTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('talks', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->string('name')->nullable(); $table->string('body'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('talks'); } }
##Model
namespace App; use Illuminate\Database\Eloquent\Model; use App\Talk; class Comment extends Model { protected $fillable = [ 'name', 'body', ]; public static $rules = array( 'name' => 'required', 'body' => 'required', ); public function talks() { return $this->belongsTo('App\Talk'); } }
namespace App; use Illuminate\Database\Eloquent\Model; use App\Comment; class Talk extends Model { protected $fillable = [ 'title', 'name', 'body', ]; public static $rules = array( 'title' => 'required', 'body' => 'required', ); public function comments() { return $this->hasMany('App\Comment'); } }
##Controller
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Talk; use App\Comment; class TalkroomController extends Controller { public function index(Request $request) { $cond_title = $request->cond_title; if ($cond_title != '') { $posts = Talk::where('title', 'like', '%'.$cond_title.'%')->get(); } else { $posts = Talk::orderBy('created_at', 'desc')->get(); } return view('talkroom.index', ['posts' => $posts, 'cond_title' => $cond_title]); }
##index view file // $post->commentsを書き加えるとエラーが起きてしまい消すと投稿画面のみちゃんと表示されます。
@extends('layouts.front') @section('content') <div class="container mt-4"> <div class="border p-4"> <h1 class="h5 mb-4"> <div class="form-group row"> <label class="col-md-2" for="title">タイトル</label> <div class="col-md-10"> <div class="title"> {{ str_limit($talk_form->title, 50) }} </div> </div> </div> <div class="form-group row"> <label class="col-md-2" for="name">名前</label> <div class="col-md-10"> <div class="name"> {{ str_limit($talk_form->name, 20) }} </div> </div> </div> <div class="form-group row"> <label class="col-md-2">本文</label> <div class="col-md-10"> <div class="body"> {{ str_limit($talk_form->body, 100) }} </div> </div> </div> <div class="form-group row"> <div class="col-md-10"> <input type="hidden" name="id" value="{{ $talk_form->id }}"> {{ csrf_field() }} </div> </div> <form class="mb-4" method="post" action="{{ action('CommentsController@post') }}" enctype="multipart/form-data"> {{ csrf_field() }} @if (count($errors) > 0) <ul> @foreach ($errors->all() as $e) <li>{{ $e }}</li> @endforeach </ul> @endif <div class="form-group col-md-6 mx-auto"> <label for="name">名前</label> <div class="col-md-6 mx-auto"> <input type="text" class="form-control" name="name" value="{{ old('name') }}"> </div> </div> <div class="form-group col-md-6 mx-auto"> <label class="col-md-2">本文</label> <div class="col-md-6 mx-auto"> <textarea id="body" class="form-control" name="body" rows="10">{{ old('body') }}</textarea> </div> </div> <div class="col-md-6 mx-auto"> <button type="submit" class="btn btn-primary"> コメントする </button> </div> </form> <section> <h2 class="h5 mb-4"> コメント </h2> @foreach($post->comments as $comment) <div class="border-top p-4"> <time class="text-secondary"> {{ $comment->created_at->format('Y.m.d H:i') }} </time> <p class="mt-2"> {{ $comment->body }} </p> </div> @endforeach </section> </div> </div> @endsection
試したこと
migration fileのメソッドや型を変えてみたり
コメント機能に関する記事やリレーションに関しての記事を調べたのですがわかりませんでした。
回答1件
あなたの回答
tips
プレビュー