Web/PHP

[라라벨] 댓글 대댓글 DB설계하기

_sparrow 2020. 4. 18. 15:04
반응형

댓글, 대댓글 구성을 위한 최소한의 DB설계이니 각자 상황에 맞게 칼럼을 바꾸거나 추가해서 사용하시길 바랍니다.

그 외에 더 좋은 DB구성 방식이 있으시면 댓글로 남겨주세요.

 

댓글과 대댓글 DB구성 (Heidi SQL프로그램)

테이블 컬럼구성을 보자면

indexComments

comment

postNum

class

order

groupNum

댓글 인덱스

댓글내용

게시글 번호

계층

댓글과 대댓글 순서

댓글 그룹

 

 

칼럼에 대한 설명

댓글 인덱스(indexComments)는 게시글 번호와 상관없이 댓글 혹은 대댓글이 작성되면  auto Increment로 1씩 증가되어 저장됩니다.

 

댓글 내용(comment) 댓글 내용을 담을 칼럼입니다.

 

게시글 번호(postNum)는 게시글 번호입니다.

 

계층(class)은 댓글과 대댓글 들을 구성하기 위한 계층입니다. class 0은 부모(댓글) class 1은 자식(대댓글) 형태가 되는 거죠

 

순서(order)는 댓글과 대댓글 관계에 맞게 정렬되어 페이지에 정렬된 상태로 전달하기 위해서 추가했습니다.

따로 페이지 처리하는 부분에서 정렬할 필요 없게끔 했습니다.

 

댓글 그룹(groupNum)은 댓글 인덱스가 들어갑니다. 하지만 대댓글은 자신의 인덱스 대신 부모의 댓글 인덱스가 저장됩니다. 대댓글이 특정 댓글에 종속되어있다는 것을 표시하기 위한 수단입니다.

 

아래의 이미지가 댓글과 대댓글 구성 예시입니다.

 

쿼리 빌더 사용법

댓글 쿼리 빌더 (SQL문으로 변환해서 사용하면 됩니다.)

//댓글 저장하라는 요청을 받고 DB에 저장합니다.

public function store(Request $request)
    {
        $name = $request->input('userName'); // 유저 이름
        $comment = $request->input('comment'); // 댓글내용
        $postNum = $request->input('postNum'); // 게시글 번호

		//테이블 틀에 이름, 내용 게시글 번호를 저장하고 indexComments값을 가져옵니다.
        $store = DB::table('comments')->insertGetId(['userName' => $name, 'comment' => $comment,
            'postNum' => $postNum]);

		// 댓글이기 떄문에 이 인덱스 값을 그룹번호로 저장해줍니다.
        DB::table('comments')->where('indexComments', $store)->update(['groupNum'=>$store]);
    
    	// 인덱스 번호를 조건으로 데이터를 가져옵니다.
    	$confirm = DB::table('comments')->where('indexComments',$store)->first();

	// 그리고 데이터를 전달해주면 됩니다.
       // 이부분에서는 각자 상황에 맞게 데이터를 전부다 전달하지않고 true/false만 전달하는 방식으로 사용해도 됩니다.
        return json_encode($confirm->indexComments,JSON_UNESCAPED_UNICODE);
    }

 

대댓글 쿼리빌더

//대댓글을 저장하라는 요청을 받고 대댓글을 저장합니다.
public function store(Request $request)
    {
    	//대댓글 작성한 댓글의 인덱스 번호를 가져옵니다.(그룹번호로 저장해야합니다.)
        $groupId = $request->input('indexComments');
        $name = $request->input('userName');
        $comment = $request->input('comment');
        $postNum = $request->input('postNum');

		//저장하려는 대댓글이 첫 대댓글인지 확인하기위한 쿼리입니다. 순서를 정해야하기때문에요
        $orderNum = DB::table('comments')->where(['postNum'=>$postNum,'groupNum'=>$groupId])->orderBy('order','desc')->first();

		//가장 마지막 대댓글 숫자에 +1을 추가해서 저장해줍니다.
        $store = DB::table('comments')->insertGetId(['userName' => $name, 'comment' => $comment,
        'postNum' => $postNum, 'groupNum'=> $groupId,'class'=> 1,'order'=>$orderNum->order+1]);

        $confirm = DB::table('comments')->where('indexComments',$store)->first();

        return json_encode($confirm->indexComments,JSON_UNESCAPED_UNICODE);
    }

 

댓글 대댓글 구성은 이렇게 하였고 추가 외의 수정은 indexComments로 요청을 하고 이 값으로 데이터 처리해주면 됩니다.

indexComments는 각자 구분되어있으니까 긴 시간이 걸리지 않으니 각자 도전해보시길 바랍니다.

 

 

 

 

반응형