본문 바로가기
IT/PHP

Laravel - 댓글 작성하기

by Sungjun_ 2020. 7. 26.

https://github.com/sungjun-ever/LaravelApp

 

sungjun-ever/LaravelApp

Contribute to sungjun-ever/LaravelApp development by creating an account on GitHub.

github.com

아래 코드들은 여기서 확인 가능합니다.

 

 

1. 모델, 컨트롤러, 마이그레이션 만들기

php artisan make:model Comment -c -m

 

터미널에 위 명령어를 입력해 한번에 모델, 컨트롤러, 마이그레이션을 만들어줍니다.

 

2. DB 테이블 구성하기

 

만들어진 create_comments_table에 아래와 같이 코드를 작성해줍니다.

 

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateCommentsTable extends Migration
{
    public function up()
    {
        Schema::create('comments', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('userID');
            $table->unsignedBigInteger('parent_id');
            $table->string('userName');
            $table->string('commentStory');
            $table->timestamps();

            $table->foreign('userID')->references('id')->on('users');
        });
    }
    
    public function down()
    {
        Schema::dropIfExists('comments');
    }
}

 

userID 콜럼은 user의 id 값을 넣어줍니다. 또한, users 테이블의 id를 참조합니다.

parent_id 콜럼은 게시물의 id 값을 넣어줍니다.

userName 콜럼은 댓글 작성자의 이름입니다.

commentStory는 댓글 내용입니다.

 

php artisan migrate

 

터미널에 위 명령어를 입력해 테이블을 만들어줍니다.

 

 

3. 모델

 

Comment.php 파일을 열어줍니다.

 

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    protected $fillable = [
      'parent_id', 'userID', 'userName', 'commentStory'
    ];
}

 

위와 같이 입력해줍시다.

 

 

3. 컨트롤러

 

CommentController.php 파일을 열어줍시다.

 

<?php

namespace App\Http\Controllers;

use App\Board;
use App\Comment;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;

class CommentController extends Controller
{
    public function store(){
        $validator = Validator::make(request()->all(), [
            'parent_id' => 'required',
            'commentStory' => 'required|max:255'
        ]);
        if($validator->fails()){
            return redirect()->back();
        } else{
            Comment::create([
                'parent_id' => request() -> parent_id,
                'userID' => auth() -> id(),
                'userName' => Auth::user()->name,
                'commentStory' => request() -> commentStory
            ]);
            return redirect()->back();
        }
    }
}

 

이렇게 입력해줍니다.

 

$validator는 유효성 검사로 조건을 넣어놓고

if문을 사용해 에러 발생시 아무것도 하지않고 전 페이지로 넘어가게 하고

에러가 없을 시에는 댓글을 작성하고 전 페이지로 가게 했습니다.

 

parent_id, commentStory는 input으로 값을 받아오고

userID와 userName은 현재 사용자의 id와 이름을 값으로 받습니다.

 

 

4. web.php

web.php 파일을 열어 아래와 같이 입력해줍니다.

 

Route::post('/comments/store', 'CommentController@store')->name('comment.add');

 

뒤에 name은 라우트에 이름을 부여한 것입니다.

 

5. 댓글 작성하기

 

현재 글을 보여주는 블레이드  파일은 show.blade.php 파일이기 때문에 저곳에 댓글 작성을 만들겠습니다.

전체 코드는  github를 참고해주시기 바랍니다.

 

{{--  댓글작성   --}}
    @auth()
    <div class="w-4/5 mx-auto mt-6 text-right">
    <form method="post" action="{{route('comment.add')}}">
        @csrf
        <input type="hidden" name="parent_id" value="{{$board->id}}">
        <textarea name="commentStory" class="border border-blue-300 resize-none w-full h-32"></textarea>
        <input type="submit" value="작성" class="mt-4 px-4 py-1 bg-gray-500 hover:bg-gray-700 text-gray-200">
    </form>
    </div>
    @endauth

@auth()을 이용해 로그인했을 경우에만 댓글 작성 창이 보이게 만들었습니다.

css는 tailwind를 사용했습니다.

 

form action에 아까 web.php에서 부여한 이름을 넣어줍니다.

hidden으로 현재 게시글의 id값을 넘겨 parent_id에 저장합니다.

 

 

 

위와 같이 아래 쪽에 댓글 작성 칸이 생깁니다.

 

댓글을 작성하면

이렇게 정상적으로 저장된 것을 알 수 있습니다.

 

 

6. 댓글 표시하기

게시판의 CRUD를 관리하는 BoardController.php 파일을 열어줍니다.

 

    public function show(Board $board){
        $boards = Board::all()->sortByDesc('id')->take(10);
        $parentID = $board -> id;
        $comment = DB::table('comments')->where('parent_id', '=', $parentID)->get();
        return view('boards.show', compact(['board', 'boards', 'comment']));
    }

 

거기서 show 부분에 위와 같이 작성을 합니다.

$board는 현재 게시물의 정보를 저장한 것입니다.

$boards는 무시하셔도 됩니다.

 

$parendID에 현재 게시물의 id 값을 가지고와 저장합니다.

$comment은 comments 테이블에서 parent_id 컬럼의 값과 $parentID 값이 같은 댓글들을 가지고와 저장합니다.

 

그리고 compact로 값들을 넘겨줍니다.

 

다시 show.blade.php로 갑니다.

 

{{--  댓글 목록  --}}
    <div class="w-5/6 mx-auto mt-8 border-t border-gray-500">
        @foreach($comment as $item)
            <div class="mt-4 w-full border-b border-gray-500">
                <p class="font-bold mb-2 ml-2">{{$item->userName}}</p>
                <div class="mb-2">
                    {{$item->commentStory}}
                </div>
            </div>
        @endforeach
    </div>

 

블레이드 문법 @foreach를 사용해 $comment에 저장된 값들을 가지고 와서 출력합니다.

 

 

 

글을 작성하고 보니까 각 게시물에 해당하는 댓글들의 id 값도 따로줘야 할 거 같습니다.

ex) 1번 게시물의 1,2,3번 댓글 // 2번 게시물의 1,2,3번 댓글

 

 

 

 

 

이전에 작성한 라라벨 글들과 코드가 다르기 때문에 github에서 전체 코드를 보는 것을 추천합니다.

'IT > PHP' 카테고리의 다른 글

Laravel - 로그인  (0) 2020.12.10
Laravel - 회원가입  (0) 2020.12.10
PHP/Laravel(11) CRUD#4  (0) 2020.02.23
PHP/Laravel(10) CRUD#3  (0) 2020.02.23
PHP/Laravel(9) CRUD#2  (0) 2020.02.22

댓글