인프런 커뮤니티 질문&답변

Moa Kim님의 프로필 이미지

작성한 질문수

[리뉴얼] React로 NodeBird SNS 만들기

시퀄라이즈 다대다관계 질문이 있습니다.

해결된 질문

작성

·

355

0

안녕하세요. 

강의 듣고 조금씩 변형해가면서 연습하고 있습니다.

 

User와 Follow 모델을 참고해서

User와 UserRealation (판매자-구매자 관계)를 작성했습니다.

  const User = sequelize.define('User', { // MySQL에는 users 테이블 생성
    id: { // 사업자번호
      type: DataTypes.STRING(30),
      allowNull: false, // 필수
      unique: true, // 유일한 값
      primaryKey: true,
  },
 
... 중략
  User.associate = (db) => {
    db.User.belongsToMany(db.User, { through: 'UsersRelation', as: 'Providers', foreignKey: 'customerId' }); // 판매자-구매자 관계
    db.User.belongsToMany(db.User, { through: 'UsersRelation', as: 'Customers', foreignKey: 'providerId' }); // 판매자-구매자 관계

 

판매자가 구매자를 등록하는 (팔로워 등록과 유사)간단한 API는 이렇고요, 

export function addCustomerAPI(data: { providerId: string, customerId: string } ) {
  return axios.patch('/user/addcustomer', data).then((response) => response.data);
}

 

이걸 실행하면 라우트에서 

  try {
      const customer = await User.findOne({ // 아이디 찾기
        where: {
            id: req.body.customerId,
        }
      });
      const provider = await User.findOne({ // 아이디 찾기
        where: {
            id: req.body.providerId,
        }
      });
      if (!customer || !provider) {
          return res.status(403).send('해당 아이디가 존재하지 않습니다.');
      }
      // await provider.addCustomers(req.body.customerId);
      await customer.addCustomers(req.body.providerId);
      res.status(200).json({ customerId: req.body.customerId });
      // res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3060');
}

이렇게 처리하는 방식입니다.

tester1이라는 판매자 아이디로 로그인해서 tttt라는 구매자를 등록하는 과정인데

제 생각으로는 

await provider.addCustomers(req.body.customerId);

이렇게 해야 providerId : tester1, customerId: tttt 이렇게 들어갈것 같은데

실제로 sql에서 까보면 반대로 들어가있습니다.

그래서 

await customer.addCustomers(req.body.providerId);

이렇게 해야 제가 의도한대로 들어가는데.. 

customer에 addcustomer로 providerId를 넣는다는게 좀 이해가 안되서 헷갈리네요.

(req.body를 까보면 providerId: tester1, customerId: tttt로 잘 받아왔습니다.)

 

처음에는 

    db.User.belongsToMany(db.User, { through: 'UsersRelation', as: 'Providers', foreignKey: 'providerId' }); // 판매자-구매자 관계
    db.User.belongsToMany(db.User, { through: 'UsersRelation', as: 'Customers', foreignKey: 'customerId' }); // 판매자-구매자 관계
 

이렇게 했다가 강의에있는 User모델 보고 

    db.User.belongsToMany(db.User, { through: 'UsersRelation', as: 'Providers', foreignKey: 'customerId' }); // 판매자-구매자 관계
    db.User.belongsToMany(db.User, { through: 'UsersRelation', as: 'Customers', foreignKey: 'providerId' }); // 판매자-구매자 관계

이렇게 바꿔놓은건데도 동일하게 작동합니다.

 

SQL도 잘 못하긴 하지만 그냥 SQL INSERT문으로 생각하면 간단한데 시퀄라이즈 모델 개념이 부족해서 너무 헷갈리네요.. 

답변 2

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

이상하네요. 구매자-판매자 관계 생성 시 콘솔에 뜨는 SQL 복사해서 올려주세요.

0

Moa Kim님의 프로필 이미지
Moa Kim
질문자

  const User = sequelize.define('User', { // MySQL에는 users 테이블 생성
    id: { // 사업자번호
      type: DataTypes.STRING(30),
      allowNull: false, // 필수
      unique: true, // 유일한 값
      primaryKey: true,
    },
    password: { // 비밀번호
      type: DataTypes.STRING(100),
      allowNull: false, // 필수
    },
    company : { // 회사명
      type: DataTypes.STRING(20),
      allowNull: false, // 필수
    },
    name : { // 담당자 이름
      type: DataTypes.STRING(10),
      allowNull: true,
    },
    phone: { // 담당자 전화번호
      type: DataTypes.STRING(20),
      allowNull: true,
    },
    email: { // 담당자 이메일
      type: DataTypes.STRING(20),
      allowNull: true,
    },
    role: { // 회원등급
      type: DataTypes.STRING(15),
      defaultValue: "NOVICE",
      // 비회원 NOVICE, 판매자 PROVIDER, 구매자 CUSTOMER, 판매-구매자 PROCUST, 관리자 ADMIN
      allowNull: false, // 필수
    },
  },{
    charset: 'utf8',
    collate: 'utf8_general_ci' // 한글 처리
  });
  User.associate = (db) => { // 릴레이션(관계) 정의
    db.User.hasMany(db.Address); // 주소목록
    db.User.hasMany(db.Order); // 주문내역
    db.User.hasMany(db.Item); // 등록한 제품.
    db.User.belongsToMany(db.User, { through: 'UsersRelation', as: 'Providers', foreignKey: 'customerId' }); // 판매자-구매자 관계
    db.User.belongsToMany(db.User, { through: 'UsersRelation', as: 'Customers', foreignKey: 'providerId' }); // 판매자-구매자 관계
    db.User.belongsToMany(db.Item, { through: 'ItemUsers' }); // 열람가능한 제품
};

 

// 고객등록
router.patch('/addcustomer', isLoggedIn, async (req, res, next) => { //
  // front의 data: { providerId:string, customerId:string }
  console.log('고객등록',req.body);
  try {
      const customer = await User.findOne({ // 아이디 찾기
        where: {
            id: req.body.customerId,
        }
      });
      const provider = await User.findOne({ // 아이디 찾기
        where: {
            id: req.body.providerId,
        }
      });
      if (!customer || !provider) {
          return res.status(403).send('해당 아이디가 존재하지 않습니다.');
      }
      await provider.addCustomers(req.body.customerId);
      // await customer.addCustomers(req.body.providerId);
      res.status(200).json({ customerId: req.body.customerId });
  } catch (error) {
      console.error(error);
      next(error); // status 500
  }
});

 

 

CREATE TABLE IF NOT EXISTS `Users` (`id` VARCHAR(30) NOT NULL UNIQUE , `password` VARCHAR(100) NOT NULL, `company` VARCHAR(20) NOT NULL, `name` VARCHAR(10), `phone` VARCHAR(20), `email` VARCHAR(20), `role` VARCHAR(15) NOT NULL DEFAULT 'NOVICE', `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;

Executing (default): SHOW INDEX FROM `Users` FROM `excuse-moa`

 

Executing (default): CREATE TABLE IF NOT EXISTS `UsersRelation` (`createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `providerId` VARCHAR(30) , `customerId` VARCHAR(30) , PRIMARY KEY (`providerId`, `customerId`), FOREIGN KEY (`providerId`) REFERENCES `Users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (`customerId`) REFERENCES `Users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;

Executing (default): SHOW INDEX FROM `UsersRelation` FROM `excuse-moa`

 

테이블 drop한다음에 서버끄고 다시 하니까 이번엔 의도한대로 작동하네요..  😅😯

답변 감사드립니다.....

Moa Kim님의 프로필 이미지

작성한 질문수

질문하기