gpt4 book ai didi

node.js - Sequelize.js 使用 hasMany 连接表两次

转载 作者:搜寻专家 更新时间:2023-10-31 23:43:35 24 4
gpt4 key购买 nike

我正在使用 Sequelize.js 在同一张表上进行双连接。我有一组团队对象和一组游戏对象。一个团队有很多场比赛,所以它在比赛表中会有外键,但每场比赛都有两支球队,所以我需要两次参加比赛。使用 sequelize ORM 执行此操作的最佳方法是什么。

Team = sequelize.define('teams',{
name : Sequelize.STRING,
location : Sequelize.STRING,
});

Game = sequelize.define('games',{
homeTeamId : Sequelize.INTEGER,
awayTeamId : Sequelize.INTEGER,
location : Sequelize.STRING,
});

// Associations
Game.hasOne(Team, {foreignKey : 'homeTeamId'});
.hasOne(Team, {foreignKey : 'awayTeamId'});

Team.hasMany(Game);

谢谢!

最佳答案

这其实是一个有趣的问题。目前 sequelize 不支持此功能,但绝对可行。我在下面概述了两种方法:

var Sequelize = require('./index');

var sequelize = new Sequelize('sequelize_test', 'root', null, {
host: "127.0.0.1",
port: 3306
});

var Team = sequelize.define('teams',{
name : Sequelize.STRING,
location : Sequelize.STRING
}, {
instanceMethods: {
getGamesOne: function () {
var chainer = new Sequelize.Utils.QueryChainer();

chainer.add(this.getHomeGames());
chainer.add(this.getAwayGames());

return new Sequelize.Utils.CustomEventEmitter(function (emitter) {
chainer.run().done(function (err, results) {
var home = results[0],
away = results[1];

if (err) emitter.emit('error', err)
else emitter.emit('success', home.concat(away));
});
}).run();
},

getGamesTwo: function () {
return Game.findAll({ where: ["homeTeamId = ? OR awayTeamId = ?", this.id, this.id ]})
}
}
});

var Game = sequelize.define('games',{
homeTeamId : Sequelize.INTEGER,
awayTeamId : Sequelize.INTEGER,
location : Sequelize.STRING
});

// Associations
Game.belongsTo(Team, {foreignKey : 'homeTeamId'})
.belongsTo(Team, {foreignKey : 'awayTeamId'});

Team.hasMany(Game, { as: 'AwayGames', foreignKey : 'awayTeamId'});
Team.hasMany(Game, { as: 'HomeGames', foreignKey : 'homeTeamId'});

Team.find(1).done(function (err, team) {
team.getGamesOne().done(function(err, games) {
console.log(games);
});
team.getGamesTwo().done(function(err, games) {
console.log(games);
});
})

GetGamesOne 使用 sequelize 的关联分别获取主场比赛和客场比赛,并在返回给您之前加入。GetGamesTwo 手动构建查询,因此您只与数据库对话一次。选择您喜欢的任何一个 - 在其中一个可能不是很清楚发生了什么,但是您正在使用 sequelize 来构建查询,因此即使您稍后更改键的名称它仍然有效。二是非常简短明了,但您必须自己处理查询。

我还将游戏与团队的关系更改为 belongsTo - 这意味着外键在游戏表中。

享受使用 Sequelize 的乐趣 ;-)

关于node.js - Sequelize.js 使用 hasMany 连接表两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14527136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com