sql >> Database teknologi >  >> RDS >> Mysql

Simpelt eksempel på mange-til-mange-relation ved hjælp af Sequelize

Migreringer

Jeg vil foreslå, at du bruger sequelize migrationer i stedet for sync() på hver model. Der er et modul - sequelize.cli der giver dig mulighed for nemt at administrere migrationer og frø. Det fremtvinger på en eller anden måde en projektstruktur ved at skabe initialiseringsfilen index.js inde i /models bibliotek over projektet. Det antages, at alle dine modeldefinitioner vil være i denne mappe. Dette script gentager alle modelfilerne (hver modeldefinition er i en separat fil, f.eks. mentee.js , question.js ) og udfører sequelize.import() for at tildele disse modeller til sequelize-forekomsten - dette giver dig adgang til dem senere via sequelize[modelName] for eksempel. sequelize.question .

Bemærk: Når du opretter migreringsfiler, husk om tidsstemplingsfelter - createdAt , updatedAt og til sidst deletedAt .

Synkroniser

Personligt bruger jeg sync() kun når jeg kører testene - dette kan vises i tre trin

  1. udfør sequelize.sync({ force: true }) for at synkronisere alle modeller
  2. kør nogle database-seeds (kan også gøres via sequelize-cli ),
  3. kør test.

Dette er meget behageligt, fordi det giver dig mulighed for at rense databasen, før du kører test, og for at skelne udvikling fra test, kan test bruge forskellige databaser, f.eks. project_test , så udviklingsdatabasen forbliver intakt.

Mange-til-mange

Lad os nu gå videre til dit problem - m:n forhold mellem to modeller. Først og fremmest på grund af det faktum, at du udfører Promise.all() , sync kan køre i en anden rækkefølge, end du tilføjer funktionerne i den. For at undgå denne situation foreslår jeg, at du bruger mapSeries funktion af Bluebird løfte, som Sequelize bruger og afslører under sequelize.Promise (dette er også årsagen til din sidste fejl om sletning af overordnet række - du forsøger at slette mentees som er refereret fra menteequestion ).

sequelize.Promise.mapSeries([
    Mentee.sync({ force: true })
  , Question.sync({ force: true })
  , MenteeQuestion.sync({ force: true })
], (model) => { return model.destroy({ where: {} }); }).then(() => {

});

Første parameter i mapSeries er en række løfter, men den anden er en funktion, som køres med resultatet af hvert tidligere defineret løfte. På grund af det faktum, at Model.sync() resulterer i selve modellen, kan vi udføre model.destroy() ved hver iteration.

Derefter kan du indsætte nogle data til databasen via create() , ligesom i eksemplet. Nu er det tid til at rette Fejlen:mentee er ikke knyttet til mentee-spørgsmål! fejl. Det opstår, fordi du har tilknyttet Mentee med Question men der er ingen sammenhæng mellem MenteeQuestion og Mentee (eller Question ). For at rette op på det, efter belongsToMany , kan du tilføje

MenteeQuestion.belongsTo(Mentee, { foreignKey: 'menteeId' });
MenteeQuestion.belongsTo(Question, { foreignKey: 'questionId' });

Nu er du i stand til at tilføje include: [Mentee, Question] når du forespørger MenteeQuestion . Du vil også køre på en anden fejl, mens du laver toJSON() , fordi du gør findAll som returnerer række af forekomster. Du kunne gøre forEach()

menteeQuestions.forEach(menteeQuestion => {
    console.log(menteeQuestion.toJSON());
});



  1. MySQL 5.5 mister efterfølgende mellemrum i forespørgsel

  2. Star Trek 3D skakdatamodel

  3. Vis dato som 30-04-2020 i stedet for 2020-04-30 fra mysql database ved hjælp af javascript

  4. Hvad er formålet med at sætte et 'N' foran funktionsparametre i TSQL?