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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

978閲覧

コメントが保存・表示できない

退会済みユーザー

退会済みユーザー

総合スコア0

Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/05/22 01:53

編集2021/05/22 02:22

前提・実現したいこと

PHP・Laravelで簡単な掲示板アプリにコメント機能を実装しています。
フォームに文字を入力しボタンを押したら、その文字が表示されるようにしたいです。
ご教授いただけると幸いです。

発生している問題・エラーメッセージ

詳細ページにてコメントを入力し送信しても、コメントが表示されません。
エラーは出ていないです。
送信後は同じ画面(詳細ページ)が表示されます。
1週間以上悩んでいるのですが、なかなか答えに辿り着けないです。

該当のソースコード

User.php

PHP

1<?php 2 3namespace App; 4 5use Illuminate\Contracts\Auth\MustVerifyEmail; 6use Illuminate\Foundation\Auth\User as Authenticatable; 7use Illuminate\Notifications\Notifiable; 8 9class User extends Authenticatable 10{ 11 use Notifiable; 12 13 /** 14 * The attributes that are mass assignable. 15 * 16 * @var array 17 */ 18 protected $fillable = [ 19 'name', 'email', 'password', 20 ]; 21 22 /** 23 * The attributes that should be hidden for arrays. 24 * 25 * @var array 26 */ 27 protected $hidden = [ 28 'password', 'remember_token', 29 ]; 30 31 /** 32 * The attributes that should be cast to native types. 33 * 34 * @var array 35 */ 36 protected $casts = [ 37 'email_verified_at' => 'datetime', 38 ]; 39}

Article.php

PHP

1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6use Illuminate\Database\Eloquent\Relations\BelongsTo; 7use Illuminate\Database\Eloquent\Relations\HasMany; 8 9class Article extends Model 10{ 11 protected $fillable = [ 12 'title', 13 'body', 14 ]; 15 16 public function user(): BelongsTo 17 { 18 return $this->belongsTo('App\User'); 19 } 20 21 public function comments(): HasMany 22 { 23 return $this->HasMany('App\Comment'); 24 } 25}

Comment.php

PHP

1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6use Illuminate\Database\Eloquent\Relations\BelongsTo; 7 8class Comment extends Model 9{ 10 protected $fillable = [ 11 'body', 12 ]; 13 14 public function user(): BelongsTo 15 { 16 return $this->belongsTo('App\User'); 17 } 18 19 public function article(): BelongsTo 20 { 21 return $this->belongsTo('App\Article'); 22 } 23}

CommentRequest.php

PHP

1<?php 2 3namespace App\Http\Requests; 4 5use Illuminate\Foundation\Http\FormRequest; 6 7class CommentRequest extends FormRequest 8{ 9 /** 10 * Determine if the user is authorized to make this request. 11 * 12 * @return bool 13 */ 14 public function authorize() 15 { 16 return true; 17 } 18 19 /** 20 * Get the validation rules that apply to the request. 21 * 22 * @return array 23 */ 24 public function rules() 25 { 26 return [ 27 'body' => 'required|max:300', 28 ]; 29 } 30 31 public function attributes() 32 { 33 return [ 34 'body' => '本文', 35 ]; 36 } 37}

ArticleController.php

PHP

1<?php 2 3namespace App\Http\Controllers; 4 5use App\Article; 6use App\Comment; 7use App\Http\Requests\ArticleRequest; 8use Illuminate\Http\Request; 9 10class ArticleController extends Controller 11{ 12 public function __construct() 13 { 14 $this->authorizeResource(Article::class, 'article'); 15 } 16 17 public function index(Request $request) 18 { 19 $search = $request->input('search'); 20 $query = Article::query(); 21 22 if (!empty($search)) { 23 $query->where('title', 'LIKE', "%{$search}%") 24 ->orWhere('body', 'LIKE', "%{$search}%"); 25 } 26 27 $articles = $query->get()->sortByDesc('created_at'); 28 29 return view('articles.index', ['articles' => $articles]); 30 } 31 32 public function create() 33 { 34 return view('articles.create'); 35 } 36 37 public function store(ArticleRequest $request, Article $article) 38 { 39 $article->fill($request->all()); 40 $article->user_id = $request->user()->id; 41 $article->save(); 42 return redirect()->route('articles.index'); 43 } 44 45 public function edit(Article $article) 46 { 47 return view('articles.edit', ['article' => $article]); 48 } 49 50 public function update(ArticleRequest $request, Article $article) 51 { 52 $article->fill($request->all())->save(); 53 return redirect()->route('articles.index'); 54 } 55 56 public function destroy(Article $article) 57 { 58 $article->delete(); 59 return redirect()->route('articles.index'); 60 } 61 62 public function show(Article $article, Comment $comment) 63 { 64 $comments = $article->comments()->orderBy('created_at', 'desc'); 65 return view('articles.show', ['article' => $article, 'comments' => $comments]); 66 } 67}

CommentController.php(storeアクションメソッド以外はまだ実装していないです。)

PHP

1<?php 2 3namespace App\Http\Controllers; 4 5use App\Comment; 6use App\Http\Requests\CommentRequest; 7use Illuminate\Http\Request; 8 9class CommentController extends Controller 10{ 11 public function store(CommentRequest $request, Comment $comment) 12 { 13 $comment->fill($request->all()); 14 $comment->user_id = $request->user()->id; 15 $comment->article_id = $request->article()->id; 16 $comment->save(); 17 return redirect()->route('articles.show'); 18 } 19 20 public function edit() 21 { 22 // 23 } 24 25 public function update() 26 { 27 // 28 } 29 30 public function destroy() 31 { 32 // 33 } 34}

show.blade.php

PHP

1@extends('app') 2 3@section('title', '詳細ページ') 4 5@section('content') 6 @include('nav') 7 <div class="container"> 8 @include('articles.card') 9 </div> 10 11 @auth 12 <form method="POST" action="{{ route('comments.store') }}"> 13 @csrf 14 <input type="hidden" name="article_id" value="{{ $article->id }}"> 15 <textarea class="form-control" name="comment" rows="4" placeholder="コメントを入力してください。">{{ old('comment') }}</textarea> 16 <button type="submit" class="btn blue-gradient btn-block"> 17 コメントする 18 </button> 19 </form> 20 @endauth 21 22 <div class=h4>コメント一覧</div> 23 @forelse($comments as $comment) 24 <div> 25 {!! nl2br(e($comment->comment)) !!} 26 </div> 27 @empty 28 <p>コメントはまだありません。</p> 29 @endforelse 30@endsection

試したこと

①mysqlにデータが保存されているか確認
SQLで下記を実行しました

mysql> SELECT id, body FROM comments ORDER BY id; Empty set (0.01 sec)

データが保存されていないことがわかりました。

②CommentController.phpのstoreアクションメソッドの編集
コメントフォームで入力した値が保存できていないということは、CommentController.phpのstoreアクションに原因があると考えました。
storeアクションメソッドを色々編集してみました。
正直まだ理解が浅いので、的外れなことを書いてるかもしれません。

PHP

1//パターン1 2$user = auth()->user(); 3$comment->fill($request->all()); 4$comment->user_id = $request->user()->id; 5$comment->user_id = $user->id; 6$comment->save(); 7return redirect()->route('articles.show'); 8 9//パターン2 10$comment->fill($request->all()); 11$comment = new Comment(); 12$comment->body = $request->body; 13$comment->save(); 14return redirect()->route('articles.show'); 15 16//パターン3 17$comment = new Comment; 18$input = $request->only($comment->getFillable()); 19$comment = $comment->create($input); 20$comment->save(); 21return redirect('/');

特に変化はありませんでした。

dd($comment);で変数の中を確認。
ヘルパ関数のddを使用して、storeアクションメソッドの$commentの内容を表示しようとしました。
結果としては、dd自体が実行されず、詳細ページが表示されました。

④ArticleController.phpのshowアクションメソッドの編集
ArticleController.phpのshowアクションメソッドを抜粋

PHP

1public function show(Article $article, Comment $comment) 2{ 3 $comments = $article->comments()->orderBy('created_at', 'desc'); 4 return view('articles.show', ['article' => $article, 'comments' => $comments]); 5}

ある方のGitHubを参考にしながら、自分なりにアレンジして書いてます。
showメソッドの引数が$commentで、関数の中身のほうが$commentsで、なぜ動くのかが理解できていないです。
$comment$commentsにしたり、$comments$commentにしたりしてみましたが、特に変化はありませんでした。

補足情報(FW/ツールのバージョンなど)

PHP 7.4.1
Laravel 6.20.26
Docker 20.10.6
docker-compose 1.29.1
WindowsOS

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

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

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

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

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

m.ts10806

2021/05/22 02:11

初歩的云々は不要かと思います。 自身で初歩的だと判断できるなら自分でなんとかできるものだからです。
m.ts10806

2021/05/22 02:13

いずれにしてもデバッグするところからでしょうね。通したい場所を通っているのか そこに想定の情報が来ているかどうか
退会済みユーザー

退会済みユーザー

2021/05/22 02:18 編集

承知しました。 今後は安易に「初歩時」という言葉を使わないようにします。
m.ts10806

2021/05/22 02:19

細かいところすみませんが「今後」は「今」も含みますし、質問は編集できますので調整してください。
退会済みユーザー

退会済みユーザー

2021/05/22 02:20

はい。 ご指摘ありがとうございます。
guest

回答1

0

ベストアンサー

おそらくCommentRequestのバリデーションに引っかかっていると思います

CommentRequestではbodyという名前でデータが送られてくることを期待していますが、コメントを入力するフォームではbodyはなくcommentという名前で入力値を送っています

投稿2021/05/22 13:05

opop1234

総合スコア26

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

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

退会済みユーザー

退会済みユーザー

2021/05/23 06:01

ご返信ありがとうございます。 コメントの入力フォームですか、全然気が付かなかったです。 <textarea class="form-control" name="comment" rows="4" placeholder="コメントを入力してください。">{{ old('comment') }}</textarea> ↓ <textarea class="form-control" name="body" rows="4" placeholder="コメントを入力してください。">{{ old('comment') }}</textarea> このように修正しました。 BadMethodCallException Method App\Http\Requests\CommentRequest::article does not exist. Bad Method Call Did you mean App\Http\Requests\CommentRequest::hasFile() ? と表示されました。 原因を調査中です。 また、show.blade.phpの<input type="hidden" name="article_id" value="{{ $article->id }}">は必要ないと思ったので、削除しました。
opop1234

2021/05/23 15:10

> BadMethodCallException Method App\Http\Requests\CommentRequest::article does not exist. CommentController内の `$request->article()->id;` が原因のエラーだとおもいます Requestクラス(正しくはFormRequestクラスですが)に `article()` というメソッドはありません `$request->user()->id;` でユーザーの情報を取得できるはRequestクラスに `user()` というメソッドをlaravelが用意してくれているからです Webサービスのほとんどがログインユーザーを取得するといったコードを書くのでlaravelが気を効かせてくれているだけです articleのidを取得したいのであればURLにパスパラメータとして埋め込むか、削除してしまったinputのhiddenで送るかになると思います
退会済みユーザー

退会済みユーザー

2021/05/24 14:13

`$request->article()->id;` が原因のエラーというのは納得ですね。 「URLにパスパラメータとして埋め込む」というやり方が個人的にイメージ湧きやすかったので、この方法を採用しました。 Route::resource('/{article_id}/comments', 'CommentController')->except(['index', 'show'])->middleware('auth'); Route::resource('/article/comments/{article_id}', 'CommentController')->except(['index', 'show'])->middleware('auth'); Route::resource('articles/{article_id}', 'CommentController')->except(['index', 'show'])->middleware('auth'); このようにルーティングを色々変えてみたのですが、 404 Not|Foundや LogicException Route pattern "×××" cannot reference variable name "article_id" more than once.になって、 なかなか解決の糸口が見えません。
退会済みユーザー

退会済みユーザー

2021/05/24 22:02

`Route::resource()`を一旦消して、`Route::post`に変更しました。 私が実装しているコメント機能はドキュメントの「Nested Resources」に該当していると考えたので、下記のように修正しました。 Route::post('articles.comments', 'CommentController@store')->name('comments.store')->middleware('auth'); 404 Not|Foundになります。 何度も質問して大変申し訳ないのですが、もう少し詳しくご教授いただくことは可能でしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問