박주니 개발 정리

기본적인 게시판 작성 방법 본문

라라벨

기본적인 게시판 작성 방법

박주니 2022. 5. 4. 11:52
728x90
반응형

먼저 진행하기에 앞서서 라라벨 crud를 숙지하시고 보시길 바랍니다. 

그럼 현재 글을 작성하면 화면에 작성된 글이 append될 수 있게 만듭니다. 

주의할 점)

  • board db에 user_id를 만들어놓습니다. 이유는 해당 user_id에 따라서 아이디 및 게시판 글 내용이 보이게 할 예정입니다. 

기본 상식)

  • user_id는 기본적으로 로그인을 진행했을 때 라라벨은 그 유저 데이터를 가지고 있으므로 controller에서 _contstruct middleware auth를 연결해서 사용하면 find를 하지 않아도 해당 유저 id를 가지고 올 수 있습니다.
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Board;
use App\Models\User;

class BoardController extends Controller
{
        /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }

    public function index(){
        $boards = Board::all();
        return view('users.index', compact('boards'));
    }

    public function create(Request $request){
        $you = auth()->user();
        $user_id = $you->id;
        Board::create([
            'title' => $request->title,
            'user_id' => $user_id
        ]);
        return redirect()->back();
    }

}
  • 설명) _construct()를 연결하고 나서 추가버튼을 클릭시 auth()->user()을 dd()로 확인해보고 제대로 나오면 그때 따로 id를 빼내서 추가해주시길 바랍니다. 

이제 user_id에 있는 email을 불러오겠습니다. 

1. Board model에서 User model을 연결하고 belongsTo를 설정합니다. 

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\User;

class Board extends Model
{
    use HasFactory;
    protected $fillable = [
        'title',
        'user_id'
    ];
    public function user()
    {
        return $this->belongsTo(User::class, 'user_id');
    }
}

참고) belongsTo(User::class, 'user_id') 의미

  • User primary key를 Board column 'user_id'에 연결한다는 의미입니다. 지금 Board DB에서 user_id에 숫자로 저장되어있다면 그것은 user에 primary key에 해당되기 때문에 그 key에 해당되는 User 데이터를 가져온다는 의미입니다.

2. BoardController에서 데이터를 get하는 class에 with()를 활용해서 board model에 belongsTo 설정한 user을 가지고옵니다.

    public function index(){
        $you = auth()->user();
        $user_id = $you->id;

        $boards = Board::with('user')->where('user_id', $user_id)->get();

        return view('users.index', compact('boards'));
    }

참고) Board::with('user')의 의미 

  • Board와 User을 user_id 기준으로 join하는 개념으로 이해하시면 됩니다. 만약 join에 대해서 이해가 안되신다면 mysql에서 join을 어떻게 활용하는 지 개념정도 파악해주시길 바랍니다. 

Tip) Log를 설정하고 Log::info로 $boards가 제대로 relationship이 되어서 user_id에 연결된 user data가 제대로 나오는 지 확인해주시길 바랍니다. 이유는 현재 다루고 있는 코드 경로가 다룰 수 있고 그 전에 오류가 나올 수 있기 때문에 계속 확인하면서 값을 전달하는 습관을 가지는게 좋습니다. dd()로 확인할 때 오류가 발생되는 경우가 있어서 추천하지 않습니다.

 

3. blade에 해당 email과 그 유저가 작성한 게시글을 가지고 옵니다.

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">board</div>
                    <div>
                        <h2>title</h2>
                        
                        <div>
                            @foreach ($boards as $board)
                                {{ $board->user->email }}
                                {{ $board->title }}
                            @endforeach
                        </div>
                    </div>
                    <form action= {{ route('board.create') }} method="POST">
                        @csrf
                        <h2>title</h2>
                        <input type="text" name="title">
                        <button type="submit">create</button>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

참고) $board->user->email 설명

  • 먼저 blade에서 foreach문안에 $board가 어떻게 전달되는지 dd($board)로 확인해주시길 바랍니다.

  • 상단에 보이는 것처럼 현재 join된 user에 정보는 "user" 배열에 있는 것이 보이기 때문에 $board->user하면 join된 user 정도에 접촉할 수 있고 거기서 필요한 정보는 email이기 때문에 $board->user->email 하시면 게시글을 작성한 이메일을 확인할 수 있습니다. 

Tip) 이것을 응용하면 댓글을 만들 수 있으니 정확히 이해하시면 어렵지 않습니다. 

728x90
반응형
Comments