Migrace
Navrhoval bych, abyste použili sequelize migrace
místo toho proveďte sync()
na každém modelu. Existuje modul - sequelize.cli
což vám umožňuje snadno spravovat migrace a semena. Nějakým způsobem vynucuje strukturu projektu vytvořením inicializačního souboru index.js
uvnitř /models
adresář projektu. Předpokládá, že všechny vaše definice modelu budou v tomto adresáři. Tento skript prochází všemi soubory modelu (každá definice modelu je v samostatném souboru, např. mentee.js
, question.js
) a provede sequelize.import()
za účelem přiřazení těchto modelů k instanci sequelize – to vám umožní přistupovat k nim později prostřednictvím sequelize[modelName]
např. sequelize.question
.
Poznámka: při vytváření migračních souborů pamatujte na pole časových razítek - createdAt
, updatedAt
a případně deletedAt
.
Synchronizovat
Osobně používám sync()
pouze když spustím testy – to se může zobrazit ve třech krocích
- proveďte
sequelize.sync({ force: true })
za účelem synchronizace všech modelů - spusťte nějakou databázi
seeds
(lze také provést pomocísequelize-cli
), - spustit testy.
To je velmi pohodlné, protože vám umožňuje vyčistit databázi před spuštěním testů a pro odlišení vývoje od testů mohou testy používat různé databáze, např. project_test
, takže vývojová databáze zůstane nedotčena.
Mnoho-mnoho
Nyní přejděme k vašemu problému - vztah m:n mezi dvěma modely. Za prvé kvůli skutečnosti, že provádíte Promise.all()
, sync
může běžet v jiném pořadí, než do kterého přidáváte funkce. Abyste se této situaci vyhnuli, doporučuji vám použít mapSeries
funkce Bluebird
slib, který Sequelize používá a vystavuje pod sequelize.Promise
(to je také důvod vaší poslední chyby při mazání nadřazeného řádku – pokoušíte se smazat mentees
na který se odkazuje z menteequestion
).
sequelize.Promise.mapSeries([
Mentee.sync({ force: true })
, Question.sync({ force: true })
, MenteeQuestion.sync({ force: true })
], (model) => { return model.destroy({ where: {} }); }).then(() => {
});
První parametr mapSeries
je pole příslibů, ale druhá je funkce, která se spouští s výsledkem každého dříve definovaného příslibu. Vzhledem k tomu, že Model.sync()
výsledky v modelu samotném, můžeme provést model.destroy()
při každé iteraci.
Poté můžete vložit některá data do databáze pomocí create()
, stejně jako v příkladu. Nyní je čas opravit Chybu:mentee není spojen s menteequestion! chyba. Dochází k tomu, protože jste přidružili Mentee
s Question
ale neexistuje žádná asociace mezi MenteeQuestion
a Mentee
(nebo Question
). Chcete-li to opravit, po belongsToMany
, můžete přidat
MenteeQuestion.belongsTo(Mentee, { foreignKey: 'menteeId' });
MenteeQuestion.belongsTo(Question, { foreignKey: 'questionId' });
Nyní můžete přidat include: [Mentee, Question]
při dotazu MenteeQuestion
. Při provádění toJSON()
byste také spustili jinou chybu , protože děláte findAll
který vrací pole instancí. Můžete udělat forEach()
menteeQuestions.forEach(menteeQuestion => {
console.log(menteeQuestion.toJSON());
});