BackEND/Laravel Project

Create , Read, Update, Delete

smartlittlepuppy 2022. 7. 31. 14:08
반응형

1. products라는 테이블을 만든다. 

php artisan make:migration create_products_table

기본테이블이 제공되어지고 여기서 내가 필요한 필드들을 추가해야한다.

php artisan migrate

2. 컨트롤러, 모델 그리고 뷰페이지를 만든다. 

php artisan make:controller ProductsController

php artisan make:model Products

 

3. 라우팅 만들어준다.

// URL이 동일하기때문에, name('dashboard')생략해도 된다. 

Route::get('/product', [ProductsController::class, 'index'])->name('product'); 

Route::post('/product', [ProductsController::class, 'store']); 

Route::delete('/product/{product}', [ProductsController::class, 'destroy'])->name('product.destroy');

Create : 제품을 등록하기

Route::post('/product', [ProductsController::class, 'store']); 

경로가 /product이면서 post방식으로 넘어왔다면, ProductsController의 store메소드를 실행 시켜라라는 의미이다. 

1) 생성자를 사용함으로써 이페이지가 실행하면 제일 먼저 여기가 실행된다. 미들웨어를 사용해서  인증된사용자만 이페이지에 접속 가능하다.

2) 뷰페이지에 넘어온 값들을 Request로 받는다. 유효성을 체크하고, 파일이 있다면 파일을 특정폴더에 저장을 하고, 넘어온데이타들을 저장한다. 

class ProductsController extends Controller
{

    public function __construct()
    {
        $this->middleware(['auth']); 
    }

    //이렇게 하지 않아도, Request하나로 끝. 
    // $title = $_POST['title'];
    // Request를 $request파라마메타값으로 받아서 처리 
    public function store(Request $request){
    //dd($request->title);
    //dd($request->file('photo'));
    //title, brand, price, cat, photo, memo
    //validate
    $this->validate($request, [
        'title' => 'required',
        'brand' => 'required',
        'price' => 'required',
        'cat' => 'required',
        'photo' => 'required',
        'memo' => 'required'
    ]);

    //파일 저장
    if($request->hasFile('photo')){
        //storage폴더 > public폴더하단에 products폴더에 저장한다.
        $uploadedPhoto = $request->file('photo')->store('products', 'public');
    }

    //로그인한 사용자의 id를 자동적으로 user_id에 넣는다. 
    //로그인한사용자만이 products테이블에 값을 넣을 수 있다.
    ///php artisan storage:link설치후 storage/products/파일명
    $request->user()->products()->create([
        'title' => $request->title,
        'brand' => $request->brand,
        'price' => $request->price,
        'cat' => $request->cat,
        'photo' => $uploadedPhoto,
        'memo' => $request->memo
    ]);

    return back(); 

}

 

Read: 제품페이지 모두 읽어오기

dashboard폴더의 index.blade.php에 products라는 키를 넘겨주다. 이 키에는 모든데이타들이 들어있다. 

public function index(){
    //dd(auth()->user()->products);
    //dd(Products::find(2));

    //한페이지당 2개의 개시물만 보이기 
    //npm i tailwindcss@3.1.6 설치해야 css제대로 먹힌다. 
    //Products모델에 있는 user, likes메소드를 로딩한다. 
    $products =  Products::orderBy('created_at','desc')->with(['user','likes'])->simplePaginate(10);

    //Call all products
    //$products = Products::get();

    return view('dashboard.index', [
        'products' => $products
    ]); 

}

Update:제품업데이트하기

 

Delete:제품삭제하기

A라는 사용자는 A가 쓴 글들만 삭제 할 수 있다. 다른사람이 쓴글은 삭제 할 수 없다. 그래서 다음과 같이 한다.

Products 모델에서 $product라는 이름으로 데이타를 갖고와서 사용한다. 

Products모델의 ownedBy메소드를 불러온다. 그값이 True가 아니라면 삭제 불가능하다. 

public function destroy (Products $product){
    //dd($product);

    if(!$product->ownedBy(auth()->user())){
        dd('no'); 
    }

    $product->delete();
    return back(); 
}

ownedBy메서도는 User모델을 $user라는 이름으로 불러온다. User테이블의 id와 products테이블의  유저아이디가 같다면 True를 리턴한다. 

class Products extends Model
{
    use HasFactory;
    protected $fillable = [
        'title',
        'brand',
        'price',
        'cat',
        'photo',
        'memo'
    ];
    public function ownedBy(User $user){
        //User테이블의 id와 products테입블의 user_id가 같나요? 같으면 True리턴한다. 
        return $user->id === $this->user_id; 
    }
 }

 

등록된 사진을 보여주기위해서는  

php artisan storage:link

/storage/products/Qc8afykIHqDeTbVFe8ths2OZuhBImwoysmdEKtWj.png 이렇게 URL을 통해서 접속이 가능하다. 

반응형