2013-04-02 97 views
11

我是新来的Sequelize,我试图弄清楚,我应该如何模拟一对多的关系。如何在续集中模拟一对多关联?

我的问题如下:一个学期,很多论文。

var Term = sequelize.define('Term', ...); 
var Paper = sequelize.define('Paper', ...); 

让我们假设我有一个术语。每学期可以有很多论文,我想为我的任期添加/删除论文。我还想获得所有期限的论文。

var term; 
... 
term.getPapers(...); 
term.setPapers(...); 
term.addPaper(paper); 
term.removePaper(paper); 

现在,让我们假设我有一篇论文。我想为我的论文设定/设定期限。

var paper; 

... 

paper.getTerm(); 
paper.setTerm(); 

如何使用sequelize实现?我一直在研究文档数小时,并在网上寻找一些胶水,但没有任何结果。我发现这种类型的关联在续集中记录得很差(一对一,多对多更好)。

更新

好,几个小时后,我摸索出它是如何工作:

Term.hasMany(Paper, { as: 'papers' }); 
Paper.hasOne(Term); 

现在我们可以这样做:

term.addPaper(paper); 
term.removePaper(paper); 

paper.getTerm() 
    .success(function(term) 
    { 
    ... 
    }); 
paper.setTerm(term); 

我已经习惯了Django,看起来Sequelize在代码和文档方面都不太成熟......

+1

我同意,Sequelize协会是非常反直觉我和文档是没有帮助。感谢您发布此信息。 –

+3

在这种情况下,你确定'Paper.hasOne()'是否是正确的关联类型?你不应该使用'Paper.belongsTo()'?根据文档,这更有意义。 –

+0

我不同意,因为我不认为一对一和多对多更好。文档太奇怪了。它甚至没有解释由关联创建的方法的参数和返回值。感谢您发布此信息。 :D(经过一番阅读,现在我认为@SlavaFominII可能是对的) – SCLeo

回答

2

这取决于你如何结构化的数据库,这将不以为,

paper.hasOne(term,{as:"PaperTerm"}) 
3

首先,必须建立关联。你正确地做到了:

Term.hasMany(Paper, { as: 'papers' }); 
    Paper.hasOne(Term); 

然后你必须同步此声明:

sequelize.sync(); 

现在留存数据。您需要先保存对象才能关联它。

term.create()... 
    paper1.create()... 
    paper2.create()... 

    term.setPapers([paper1, paper2]).success(function() { 
    // saved! 
    }) 

参考:http://docs.sequelizejs.com/en/1.7.0/docs/associations/#many-to-many-associations