[BookShop 프로젝트] 장바구니 API - fk제약조건, in(~, ~)

 

DB에서 제약조건 이름은 스키마 전체에서 유니크해야 함

[fk 제약조건 이름짓기]

fk_기준 테이블명_참조테이블명_참조키 

  • cartItems.user_id > users.id : fk_cartItems_users_id
  • likes.user_id > users.id : fk_likes_users_id
  •  

 

index 

  • 스키마 단위로 유니크
  • 다른 테이블이라도 같은 이름 사용 ❌


기본 CartController.js

const conn = require('../mariadb'); //db 모듈
const {StatusCodes} = require('http-status-codes'); //status code 모듈

// 장바구니 담기
const addToCart = (req, res) => {
    const {book_id, quantity, user_id} = req.body;
    const {id} = req.params; 

    let sql = "INSERT INTO cartItems(book_id, quantity, user_id) VALUES(?, ?, ?);";
    let values = [book_id, quantity, user_id];
    conn.query(sql, values, 
        (err, results) => {
            if(err) {
                console.log(err);
                return res.status(StatusCodes.BAD_REQUEST).end(); 
            }

            return res.status(StatusCodes.OK).json(results);
    })  
}

// 장바구니 아이템 목록 조회 
const getCartItems = (req, res) => {
    const {user_id} = req.body;

    let sql = `SELECT cartItems.id, book_id, title, summary, quantity, price 
                    FROM cartItems LEFT JOIN books 
                    ON cartItems.book_id = books.id
                    WHERE user_id = ?;`;
    conn.query(sql, user_id, 
        (err, results) => {
            if(err) {
                console.log(err);
                return res.status(StatusCodes.BAD_REQUEST).end(); 
            }

            return res.status(StatusCodes.OK).json(results);
    })
}

// 장바구니 아이템 삭제 
const removeCartItem = (req, res) => {
    const {id} = req.params;

    let sql = "DELETE FROM cartItems WHERE id = ?;";
    conn.query(sql, id, 
        (err, results) => {
            if(err) {
                console.log(err);
                return res.status(StatusCodes.BAD_REQUEST).end(); 
            }

            return res.status(StatusCodes.OK).json(results);
    })
}

module.exports = {
    addToCart,
    getCartItems,
    removeCartItem
}

구매 예상 장바구니 목록 조회 

선택한 아이템에 따른 장바구니 목록 조회 

//장바구니에서 선택한(장바구니 도서 id) 아이템 목록 조회 = 선택한 장바구니 상품 목록 조회
SELECT * FROM Bookshop.cartitems WHERE user_id=1 AND id IN(1,3);
컬럼명 IN (값1, 값2, 값3 ...)

해당 컬럼 값이 괄호 안 목록 중 하나라도 일치하면 TRUE

 

req.body에 배열을 넣고, sql의 ?에 배열의 요소마다 넣어줘야할때

바로 values에 selected을 넣어줘도, 배열의 요소 하나하나에 ?을 알아서 배당해서 넣어줌. 

// 장바구니 아이템 목록 조회 
const getCartItems = (req, res) => {
    const {user_id, selected} = req.body; // selected = [1,3]

    let sql = `SELECT cartItems.id, book_id, title, summary, quantity, price 
                    FROM cartItems LEFT JOIN books 
                    ON cartItems.book_id = books.id
                    WHERE user_id = ? AND cartItems.id IN (?);`;
    let values = [user_id, selected];
    conn.query(sql, values, 
        (err, results) => {
            if(err) {
                console.log(err);
                return res.status(StatusCodes.BAD_REQUEST).end(); 
            }

            return res.status(StatusCodes.OK).json(results);
    })
}