sql >> Databáze >  >> RDS >> Mysql

Jednoduchý příklad vztahu many-to-many pomocí Sequelize

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

  1. proveďte sequelize.sync({ force: true }) za účelem synchronizace všech modelů
  2. spusťte nějakou databázi seeds (lze také provést pomocí sequelize-cli ),
  3. 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());
});



  1. Jak LocalTimeStamp() funguje v PostgreSQL

  2. PHP MySQL Yii - čtení databáze, nikoli zápis

  3. Jak správně používat strftime a datetime pomocí knihovny Room?

  4. Jak nainstaluji pouze klientské nástroje pro PostgreSQL na Windows?