Sequelize - findOrCreate na tabela "através", na associação belongsToMany
Primeiro de tudo, eu sou bastante novo no Node.JS e ainda mais novo no Sequelize, e isso me incomoda há um tempo. Eu tenho as seguintes entidades de modelo:
Match.js
module.exports = function(sequelize, DataTypes) {
var Match = sequelize.define('Match', {
matchId: {
type: DataTypes.BIGINT,
field: 'match_id'
},
server: {
type: DataTypes.STRING
},
(...)
rankedBoo: {
type: DataTypes.BOOLEAN,
field: 'ranked_boo'
}
}, {
classMethods: {
associate: function(models) {
Match.belongsToMany(models.Summoner, {as: 'Participants', through: 'SummonerMatch'});
}
},
freezeTableName: true,
underscored: true
});
return Match;
};
Summoner.js
module.exports = function(sequelize, DataTypes) {
var Summoner = sequelize.define('Summoner', {
summonerId: {
type: DataTypes.INTEGER,
field: 'summoner_id'
},
server: {
type: DataTypes.STRING
},
summonerName: {
type: DataTypes.STRING,
field: 'summoner_name'
},
mainChampion: {
type: DataTypes.INTEGER,
field: 'main_champion'
}
}, {
classMethods: {
associate: function(models) {
Summoner.belongsToMany(models.Match, {as: 'SummonerMatches', through: 'SummonerMatch'});
Summoner.hasOne(models.RankedStats);
Summoner.hasMany(models.RankedHistory, { as: { singular: 'RankedHistory', plural: 'RankedHistory' }});
}
},
freezeTableName: true,
underscored: true
});
return Summoner;
};
SummonerMatch.js
module.exports = function(sequelize, DataTypes) {
var SummonerMatch = sequelize.define('SummonerMatch', {
championId: {
type: DataTypes.INTEGER,
field: 'champion_id'
},
role: {
type: DataTypes.STRING
},
(...)
sightWardsBought: {
type: DataTypes.INTEGER,
field: 'sight_wards_bought'
}
}, {
freezeTableName: true,
underscored: true
});
return SummonerMatch;
};
Agora estou tentando criar uma nova correspondência e associá-la a um invocador, e estou fazendo o seguinte:
summoner.createSummonerMatch(matchInfo, matchDetails).then(
function () {
callback();
return null;
});
OndematchInfo contém os atributos da entidade "Corresponder" ematchDetails contém os atributos da entidade "SummonerMatch".
Está tudo bem, mas não verifica se a correspondência já existe, então estou tentando usarfindOrCreate aqui.
models.Match.findOrCreate({
include: [ {model: models.Summoner, as: 'Participants'}],
where: { matchId: matchInfo.matchId, server: matchInfo.server },
defaults: {
matchMode: queueType,
matchDate: new Date(matchCreation),
matchDuration: matchDurationInSeconds,
rankedBoo: rankedBoo
}
}).spread(function(match, created) {
console.log(created)
});
Isso quase faz o truque (cria uma nova linha na tabela Match, mas não no SummonerMatch). Como devo proceder para inserir informações no SummonerMatch também? Tentei algumas coisas (adicionando atributos aos padrões, alternando-os para uma matriz, aprimorando com o include, mas sem sucesso até agora.
Estou perdendo alguma coisa, mas não consigo descobrir o que. Qualquer ajuda é muito apreciada :)
[EDIT] Caso alguém venha aqui procurando respostas sobre como fazê-lo, isso funciona, mas não tenho certeza se é a melhor abordagem:
models.Match.findOrCreate({
include: [ {model: models.Summoner, as: 'Participants'}],
where: { matchId: matchInfo.matchId, server: matchInfo.server },
defaults: {
matchMode: queueType,
matchDate: new Date(matchCreation),
matchDuration: matchDurationInSeconds,
rankedBoo: rankedBoo
}
}).spread(function(match, created) {
match.addParticipant(summoner, matchDetails).then(
function () {
console.log('Done')
}
)
});
Ele está criando uma correspondência, se não existir, e adicionando um participante posteriormente. Não existe uma maneira de fazer tudo de uma vez?