2013-04-02 44 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