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

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

ただいまの
回答率

88.92%

laravel 投稿のコメント機能 SQLSTATE[42S22]: Column not found

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 170

yuki911

score 23

laravelでリレーションを使用してposts,commentテーブルを繋ぎ、投稿のコメント欄の制作をしています。

showページでコメントの入力をすると投稿表示されず、SQLSTATE[42S22]: Column not found: 1054 Unknown column 'post_id' in 'field list' (SQL: insert into posts (post_idcommentupdated_atcreated_at) values (32, ああ, 2020-07-23 10:18:14, 2020-07-23 10:18:14))と出てしまいました。

commentとpost_idはhiddenでformから受け取っています。
リレーションのデータをdbに保存したりすることがうまくいっていないと思うので、アドバイスいただけるとありがたいです。

show.blade.php

@extends('layouts.app')
@section('title', '詳細記事')

@section('content')
    <div class="container mt-4">
        <div class="border p-4">
        <img src="{{ asset('storage/post_image/' . $post->path) }}">
            <h1 class="h5 mb-4">
                {{ $post->title }}
            </h1>

            <p class="mb-5">
                {!! nl2br(e($post->body)) !!}
            </p>

            <section>
                <h2 class="h5 mb-4">
                    コメント
                </h2>

                {{ Form::open(['action' => 'CommentController@store', 'method' => 'post']) }}
                    {{ Form::textarea('comment', '', ['id' => 'body', 'size' => '50x3']) }}
                    {{ Form::hidden('post_id',$post->id) }}
                    <div>
                        {{ Form::submit('コメントする', ['class' => 'btn btn-primary']) }}
                    </div>
                {{ Form::close() }}

                @forelse((array)$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">
                            {!! nl2br(e($comment->commetnt)) !!}
                        </p>
                    </div>
                @empty
                    <p>コメントはまだありません。</p>
                @endforelse
            </section>
        </div>
    </div>
@endsection

index.blade.php

@extends('layouts.app')
@section('title', '投稿アプリ')

@section('content')
    @section('maincopy', '投稿してください')

      <!-- form -->
      {{ Form::open(['action' => 'PostController@index', 'method' => 'post' , 'enctype' => 'multipart/form-data']) }}
        <p>タイトル<br/>{{ Form::text('title', '', ['id' => 'title', 'size' => 50]) }}</p>
        <p>内容<br/>{{ Form::textarea('body', '', ['id' => 'body', 'size' => '50x3']) }}</p>
        {{ Form::file('path') }}
        <div>
            {{ Form::submit('投稿', ['class' => 'btn btn-success btn-lg']) }}
        </div>
      {{ Form::close() }}
    </div>
  </section>

    <!-- 投稿部分 -->
    @if(count($items) > 0)
        @foreach($items as $item)
        <a href="{{ route('post.show', [$item->id]) }}">
            <div class="album py-5 bg-light">
                <div class="container">
                <div class="row">
                    <div class="col-md-4">
                    <div class="card mb-4 shadow-sm">
                        <img src="{{ asset('storage/post_image/' . $item->path) }}">
                        <div class="card-body">
                        <p class="card-text">{{ $item->title}}</p>
                        <p class="card-text">{{ $item->body}}</p>
                        <div class="d-flex justify-content-between align-items-center">
                            <div class="btn-group">
                            <button type="button" class="btn btn-sm btn-outline-secondary">編集</button>
                            <button type="button" class="btn btn-sm btn-outline-secondary">削除</button>
                            </div>
                            @if ($item->comment->count())
                              <span class="badge badge-primary">
                                  コメント {{ $item->comment->count() }}</span>
                            @endif
                            <small class="text-muted">{{ $item->created_at}}</small>
                        </div>
                        </div>
                    </div>
                    </div>
                </div>
                </div>
            </div>
        </a>
        @endforeach
    @else
        <div>投稿記事がありません</div>
    @endif
@endsection

CommentController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests\CommentRequest;

use App\Models\Post;
use App\Models\Comment;

class CommentController extends Controller
{
    public function store(CommentRequest $request)
    {
         $post = Post::findOrFail($request->post_id);
         $post->comment = $request->comment;
         $post->save();

        return redirect()->route('post.show', compact('post'));
    }
}

comment.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    protected $fillable = [
        'comment',
        'post_id',
    ];

    public function post()
    {
        return $this->belongsTo('App\Models\Post');
    }
}

post.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $fillable = [
        'title',
        'body',
        'path',
    ];

    public function comment()
    {
        return $this->hasMany('App\Models\Comment');
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

insert into posts (post_id, comment, updated_at, created_at) 
values (32, ああ, 2020-07-23 10:18:14, 2020-07-23 10:18:14))

エラ〜メッセージにでているこれを見ると、コメント じゃなくて posts に挿入しようとしてるな。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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