2013-04-02 14 views
11

Jestem nowy w Sequelize, i próbuję wymyślić, jak mam modelować relację jeden-do-wielu.Jak modelować relację jeden-do-wielu w sequelu?

Mój problem jest następujący: jeden termin, wiele artykułów.

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

Załóżmy, że mam termin. Każdy termin może mieć wiele artykułów, a ja chciałbym dodać/usunąć dokumenty na mój semestr. Chciałbym również uzyskać wszystkie dokumenty na ten termin.

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

Teraz załóżmy, że mam referat. Chciałbym/ustawić termin dla mojego papieru.

var paper; 

... 

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

Jak można to osiągnąć przy użyciu sequelu? Przez wiele godzin studiowałem docs, a także szukałem trochę kleju w sieci, ale bez żadnych rezultatów. Uważam, że ten rodzaj powiązania jest bardzo słabo udokumentowany w sequelu (jeden do jednego i wiele do wielu jest znacznie lepszy).

Aktualizacja:

porządku, kilka godzin później pracowałem się, jak to działa:

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

Teraz możemy zrobić:

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

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

ja przyzwyczaiłem się do Django, i wydaje się, że Sequelize jest FAR mniej dojrzałe, zarówno pod względem kodu jak i dokumentacji ...

+1

zgadzam, stowarzyszenia Sequelize są niezwykle intuicyjne do mnie i dokumentacja nie pomaga. Dziękujemy za opublikowanie tego. –

+3

Czy jesteś pewien, że 'Paper.hasOne()' jest w tym przypadku prawidłowym typem powiązania? Nie powinieneś używać 'Paper.belongsTo()'? To ma więcej sensu, zgodnie z dokumentami. –

+0

Nie zgadzam się, ponieważ nie uważam, że jeden do jednego i wiele do wielu jest lepszych. Dokumentacja jest tak dziwna. Nie wyjaśnia nawet parametrów i wartości zwracanych metod tworzonych przez asocjacje. Dziękujemy za opublikowanie tego. : D (Po pewnym czytaniu, teraz myślę, że @SlavaFominII ma prawdopodobnie rację) – SCLeo

Odpowiedz

2

to zależy od tego, jak zostały skonstruowane bazy, to zrobi myśli ..

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

Najpierw trzeba utworzyć stowarzyszenie. Zrobiłeś to poprawnie:

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

Następnie trzeba zsynchronizować tej deklaracji:

sequelize.sync(); 

A teraz utrzymują się dane. Musisz zapisać obiekty wcześniej, aby je skojarzyć.

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

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

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

Powiązane problemy