使用Sequelize.js从关联表中获取值

khe*_*hex 12 sequelize.js

team table               match table
===========     ================================
tid= name       mid=   date =home_team=away_team
=============   ================================
01 = denver     01 =10.11.13 =   01    =   04
02 = minesota   02 =11.11.13 =   02    =   03
03 = orlando    03 =11.11.13 =   04    =   02
04 = portland   04 =12.11.13 =   03    =   01
Run Code Online (Sandbox Code Playgroud)

我有一个经典的SQL JOIN问题 - 填充匹配数据,无法获取位于另一个表中的主队和客队的名称.

var Team = sequelize.define('Team', { ... });
var Match = sequelize.define('Match',{ .. });

Team.hasOne(Match, {foreignKey: 'home_team', as: 'Home'})
Team.hasOne(Match, {foreignKey: 'away_team', as: 'Away'});
Run Code Online (Sandbox Code Playgroud)

正如我在创建后从Docs中了解到的那样as: 'Home,as: 'Away我收到了一些吸气剂和装置,Match.getHome但我很困惑.我该怎么用呢

Match.find({where: {id: 1}}).success(function(match) {
    console.log(match);
});
Run Code Online (Sandbox Code Playgroud)

Jan*_*ier 19

问题在于你的关联.您只定义了团队之间的关联,但现在您想要从匹配到团队的另一种方式.这意味着你必须这样做:

Match.belongsTo(Team, {foreignKey: 'home_team', as: 'Home'});
Match.belongsTo(Team, {foreignKey: 'away_team', as: 'Away'});
Run Code Online (Sandbox Code Playgroud)

之后你就可以做到

Match.find({where: {mid: 1}}).success(function(match) {
    match.getHome().success(function(home_team) {

    });
});
Run Code Online (Sandbox Code Playgroud)

或者您可以使用预先加载:

Match.find({
    where: { mid: 1 }, 
    include: [
        { model: Team, as: 'Home'}
    ]
}).success(function(match) {
    // Here you can access the home team data in match.home
});
Run Code Online (Sandbox Code Playgroud)

如果你想同时拥有主队和客队:

Match.find({
    where: { mid: 1 }, 
    include: [
        { model: Team, as: 'Home'}
        { model: Team, as: 'Away'}
    ]
}).success(function(match) {
    // Here you can access the home team data in match.home and away team in match.away
});
Run Code Online (Sandbox Code Playgroud)

  • 你不是唯一一个,我们经常会对这些问题提出疑问.文档中有一个TODO可以使关联类型更清晰,如果你想https://github.com/sequelize/sequelize-doc/issues/80(我是一个续集的维护者,你可以在那里添加你的声音)为什么我这么认识这些协会:)) (4认同)
  • 非常感谢.我对所有这些`.hasOne()和`.belongsTo()`非常困惑 (2认同)