前提
勉強のためにLaravel 5.1 LTSでシンプルなSNSサイトを開発しています。
実装した主な機能
- ユーザー登録・ログイン認証
- フォロー機能
- 投稿機能
- お気に入り機能
- ユーザー一覧表示
- フォロー・フォロワー一覧表示
- 投稿一覧表示
- お気に入り一覧表示
実現したいこと
現在、投稿に対してコメントする機能を実装しようとしています。
DBへの書き込みには $fillable
を用いて実装したいと思っています。
発生している問題・エラーメッセージ
一先ず、ページ上に設置したフォームからコメントを送信して、それをDBに書き込めるようにしようとしているところですが、これが実装できないため、コメントを表示するための view ファイルはまだ仮の状態です。
フォームからコメントを送信すると下記のエラーメッセージが出ます。
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`microposts`.`comments`, CONSTRAINT `comments_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE) (SQL: insert into `comments` (`comment`, `updated_at`, `created_at`) values (コメントテスト, 2018-05-03 19:50:00, 2018-05-03 19:50:00))
試したこと
エラーはDBの外部キー制約関係の問題のようですので、試しに comments テーブル作成時に定義した全ての外部キー制約を dropForeign したところ、comment テーブルの comment, created_at, updated_at カラムには期待通りの値が書き込まれましたが、それ以外で必要な user_id と micropost_id カラムに値が書き込まれません。
自信がない部分等
リレーション関連と CommentsController@store での処理に自信がありませんが、具体的にどうすれば良いのかは分かりません。
ご教授よろしくお願い致します。
現状のコード
コメント用テーブル
2018_04_29_180548_create_comments_table.php
php
1<?php 2 3use Illuminate\Database\Schema\Blueprint; 4use Illuminate\Database\Migrations\Migration; 5 6class CreateCommentsTable extends Migration 7{ 8 9 public function up() 10 { 11 Schema::create('comments', function (Blueprint $table) { 12 $table->increments('id'); 13 $table->integer('user_id')->unsigned()->index(); 14 $table->integer('micropost_id')->unsigned()->index(); 15 $table->string('name'); // しばらくは使う予定無し 16 $table->string('email'); // しばらくは使う予定無し 17 $table->text('comment'); 18 $table->boolean('approved'); // しばらくは使う予定無し 19 $table->timestamps(); 20 21 $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 22 $table->foreign('micropost_id')->references('id')->on('microposts')->onDelete('cascade'); 23 }); 24 } 25 26 public function down() 27 { 28 Schema::drop('comments'); 29 } 30} 31
コメント用のモデル
Comment.php
php
1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7class Comment extends Model 8{ 9 public function micropost() 10 { 11 return $this->belongsTo(Micropost::class); 12 } 13} 14
投稿用のモデル
Micropost.php
php
1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7class Micropost extends Model 8{ 9 protected $fillable = ['content', 'user_id']; 10 11 public function user() 12 { 13 return $this->belongsTo(User::class); 14 } 15 16 public function favorites() // リレーションの定義 17 { 18 return $this->belongsToMany(User::class, 'favorites', 'micropost_id', 'user_id')->withTimestamps(); 19 } 20 21 public function is_favorited_by($user_id) 22 { 23 return $this->favorites()->where('user_id', $user_id)->exists(); 24 } 25 26 public function comments() 27 { 28 return $this->hasMany(Comment::class); 29 } 30} 31
コメント用のコントローラー
CommentsController.php
php
1 2<?php 3 4namespace App\Http\Controllers; 5 6use Illuminate\Http\Request; 7 8use App\Http\Requests; 9use App\Http\Controllers\Controller; 10use App\User; 11use App\Micropost; 12use App\Comment; 13 14class CommentsController extends Controller 15{ 16// その他アクション省略 17 public function store(Request $request) 18 { 19 // $this->validate($request, [ 20 // 'content' => 'required|max:255', 21 // ]); 22 23 // 最終的には $fillable で実装 24 $comment = new Comment; 25 $comment->comment = $request->comment; 26 $comment->save(); 27 28 return redirect()->back(); 29 } 30 31 public function show($micropost_id) 32 { 33 $micropost = Micropost::find($micropost_id); 34 $user = User::where('id', $micropost->user_id)->first(); 35 36 return view('comments.comments', compact('micropost', 'user')); 37 } 38// その他アクション省略 39}
コメント 投稿フォーム・表示用の view
comments.blade.php
php
1@extends('layouts.app') 2 3@section('content') 4<div class="media-left"> 5 <img class="media-object img-rounded" src="{{ Gravatar::src($user->email, 50) }}" alt=""> 6</div> 7<div class="media-body"> 8 <div> 9 {!! link_to_route('users.show', $user->name, ['id' => $user->id]) !!} <span class="text-muted">posted at {{ $micropost->created_at }}</span> 10 </div> 11 <div> 12 <p>{!! nl2br(e($micropost->content)) !!}</p> 13 </div> 14 <div class="post-footer"> 15 <div class="btn-group"> 16 @include('favorites.favorite_button') 17 </div> 18 <div class="btn-group"> 19 @if (Auth::user()->id == $micropost->user_id) 20 {!! Form::open(['route' => ['microposts.destroy', $micropost->id], 'method' => 'delete']) !!} 21 {!! Form::submit('Delete', ['class' => 'btn btn-danger btn-xs']) !!} 22 {!! Form::close() !!} 23 @endif 24 </div> 25 <!--ここにマージンを挿入--> 26 <div class="row"> 27 <aside class="col-xs-3"> 28 {!! Form::open(['route' => 'comments.store']) !!} 29 <div class="form-group"> 30 {!! Form::textarea('comment', old('comment'), ['class' => 'form-control', 'rows' => '5']) !!} 31 </div> 32 {!! Form::submit('Post comment', ['class' => 'btn btn-primary btn-block']) !!} 33 {!! Form::close() !!} 34 </aside> 35 </div> 36 <!--ここに境界線を挿入--> 37 38 <!--ここにコメント一覧をループで挿入--> 39 40 </div> 41</div> 42@endsection

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/03 12:28 編集
2018/05/09 06:21
2018/05/10 10:55
2018/05/10 12:45
2018/05/10 12:47