sql >> Databasteknik >  >> RDS >> Mysql

Enkelt exempel på många-till-många-relation med Sequelize

Migreringar

Jag skulle föreslå att du använder sequelize migrationer gör istället sync() på varje modell. Det finns en modul - sequelize.cli som gör att du enkelt kan hantera migrationer och frön. Det tvingar på något sätt fram en projektstruktur genom att skapa initialiseringsfilen index.js inuti /models katalog över projektet. Det förutsätter att alla dina modelldefinitioner kommer att finnas i den här katalogen. Detta skript itererar genom alla modellfiler (varje modelldefinition finns i en separat fil, t.ex. mentee.js , question.js ) och utför sequelize.import() för att tilldela dessa modeller till sequelize-instansen - detta låter dig komma åt dem senare via sequelize[modelName] t.ex. sequelize.question .

Obs! när du skapar migreringsfiler kom ihåg tidsstämpelfälten - createdAt , updatedAt och så småningom deletedAt .

Synkronisera

Personligen använder jag sync() bara när jag kör testerna - detta kan visas i tre steg

  1. utför sequelize.sync({ force: true }) för att synkronisera alla modeller
  2. kör några databas-seeds (kan också göras via sequelize-cli ),
  3. kör tester.

Detta är mycket bekvämt eftersom det låter dig rengöra databasen innan du kör tester, och för att skilja utveckling från tester kan tester använda olika databas, t.ex. project_test , så att utvecklingsdatabasen förblir intakt.

Många-till-många

Låt oss nu gå vidare till ditt problem - m:n relation mellan två modeller. Först och främst på grund av det faktum att du utför Promise.all() , sync kan köras i annan ordning än du lägger till funktionerna i den. För att undvika denna situation föreslår jag att du använder mapSeries funktion hos Bluebird lova, som Sequelize använder och exponerar under sequelize.Promise (detta är också anledningen till ditt senaste fel om att ta bort överordnad rad - du försöker ta bort mentees som refereras från menteequestion ).

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

});

Första parametern i mapSeries är en rad löften, men den andra är en funktion som körs med resultatet av varje tidigare definierat löfte. På grund av det faktum att Model.sync() resulterar i själva modellen kan vi utföra model.destroy() vid varje iteration.

Efter det kan du infoga lite data i databasen via create() , precis som i exemplet. Nu är det dags att åtgärda Fel:adepten är inte kopplad till adeptfrågan! fel. Det beror på att du har kopplat Mentee med Question men det finns ingen koppling mellan MenteeQuestion och Mentee (eller Question ). För att fixa det, efter belongsToMany , kan du lägga till

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

Nu kan du lägga till include: [Mentee, Question] när du frågar MenteeQuestion . Du skulle också köra på ett annat fel när du gjorde toJSON() , eftersom du gör findAll som returnerar en mängd instanser. Du kan göra forEach()

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



  1. Kan någon rekommendera en bra handledning om MySQL-index, speciellt när den används i en order by-klausul under en join?

  2. Ett bättre sätt att generera denna json-array från MySql-data med php

  3. MySQL SHA2-funktionen verkar inte fungera

  4. Mysql:resultat från de senaste sju dagarna