https://github.com/sungjun-ever/LaravelApp
아래 코드들은 여기서 확인 가능합니다.
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 |
댓글