Sequalize의 두 테이블 사이에 여러 유형의 다대다 관계가 있는 경우
노드용 Sequelize를 사용하고 있으며 사용자와 아이템이 있습니다.사용자는 투표 또는 추천과 같은 다양한 방법으로 항목과 상호 작용할 수 있습니다(이 경우 서로 다른 두 가지 사항).
처음에는 두 가지 다른 관계를 가지려고 했는데 Sequelize는 remove Item 콜이 하나밖에 없어서 어떤 것을 지정해야 할지 모르겠어요.
플랜 2는 1개의 다대 다테이블에 추가 요소 "type"을 작성하여 종류를 지정할 수 있도록 하는 것이었습니다.추가 시 유형을 지정할 수 있습니다.이로 인해 위조 키와 기본적으로 쌍을 고유하게 만드는 두 가지 문제가 발생했습니다.DB에서 수동으로 제약을 제거하여 수정했습니다(ID를 프라이머리 키 자동증분으로 설정).두 번째로는 어떻게 삭제해야 할지 모르겠어= 타입을 원하는 타입으로 지정하면 좋을지.
코드:
테이블을 작성하려면:
var UserActions = sequelize.define('userActions', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
type: DataTypes.STRING
});
항목을 제거하려면:
models.Item.findOne({where: {id : params.itemID}}).then(function (video){
models.User.findOne({where: {id : params.itemID}}).then(function (user){
if(params.applaud == "true") {
console.log("Add applaud");
user.addItem(video,{type:"commend"});
} else {
user.removeItem(item,{where: {type:"commend"}});
console.log("Remove, Commendation");
}
res.json({'response' : 'Success'});
});
});
문제는 추천만 삭제하고 싶을 때 아이템과 사용자 간의 모든 상호작용이 삭제된다는 것입니다.
Sequelize에서 동일한 두 테이블 간의 여러 대 여러 관계를 가장 잘 관리하는 방법은 무엇입니까?
그래, 알았어.
연결에서 'as'를 통해 별칭을 지정해야 합니다.
User.belongsToMany(models.Item, {through: 'votes', as: 'votes'});
User.belongsToMany(models.Item, {through: 'commend', as: 'commend'});
다음으로 쿼리를 추가할 수 있습니다.
models.Item.findOne({where: {id: item.id},
include: [{
model: models.User,
as: 'votes'
}]
})
추가할 수 있는 항목:
user.addVote(item);
또는
user.addCommend(item);
삭제 방법:
user.removeVote(item);
또는
user.removeCommend(item)
그리고 그것은 원하는 대로 작동한다.
언급URL : https://stackoverflow.com/questions/38648560/having-multiple-types-of-many-to-many-relationships-between-two-tables-in-sequal
'programing' 카테고리의 다른 글
PHP - 연관 배열 시작 부분에 항목 추가 (0) | 2022.09.28 |
---|---|
JavaScript regex를 여러 줄에 걸쳐 사용하는 방법 (0) | 2022.09.28 |
Windows에서 MariaDB의 비밀번호를 재설정하는 방법 (0) | 2022.09.28 |
라라벨 패키지 매니페스트php: 정의되지 않은 인덱스: 이름 (0) | 2022.09.28 |
PHP의 인터페이스 포인트는 무엇입니까? (0) | 2022.09.28 |