2013-11-22 3 views
10
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 

У меня есть классическая проблема SQL JOIN - заполнены данные соответствия и не могут получить имена домашних и отдаленных команд, которые находятся в другой таблице.Получить значения из связанной таблицы с Sequelize.js

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'}); 

Как я понял из Docs после создания as: 'Home и as: 'Away я получить некоторые добытчиками и сеттеров, как Match.getHome, но я запутался. как я могу использовать его

Match.find({where: {id: 1}}).success(function(match) { 
    console.log(match); 
}); 

ответ

15

Проблема заключается в вашей ассоциации. Вы только определили ассоциацию из команды, чтобы соответствовать, но теперь вы хотите пойти другим путем, от матча к команде. Это означает, что вы должны сделать:

Match.belongsTo(Team, {foreignKey: 'home_team', as: 'Home'}); 
Match.belongsTo(Team, {foreignKey: 'away_team', as: 'Away'}); 

После этого вы можете сделать

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

    }); 
}); 

Или вы можете использовать жадной загрузки:

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

Если вы хотите, как дома и на выезде команды на один раз:

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 
}); 
+0

Большое спасибо. Я очень смущен всеми этими «.hasOne()» и «.belongsTo()» – khex

+3

. Вы не единственный, мы часто задаем им вопросы. В документах есть TODO, чтобы сделать типы связей более четкими, вы можете добавить свой голос там, если хотите https://github.com/sequelize/sequelize-doc/issues/80 (я сторонник продолжения, это почему я так хорошо знаю ассоциации :)) –

+1

Я не совсем уверен, что вы подразумеваете под этим последним комментарием? Не могли бы вы обновить свой вопрос с результатом, которого хотите достичь? –