Wie ginge das? Ein Satz hat mehrere Vokabeln und ein Benutzer soll dann mehrere Sätze mit Vokabeln habn dürfen.
Eine „Zwischentabelle“ BenutzerSatz?
Edit, das mit dem AI in zwei Spalten geht doch nicht! Dann ist die Frage, wie man an die nächsthöhere gelangt?
Die Assoziationen sind jetzt
User.hasMany(UserSatz, { foreignKey: { allowNull: false }, onDelete: 'CASCADE' });
Satz.hasMany(UserSatz, { foreignKey: { allowNull: false }, onDelete: 'CASCADE' });
Satz.hasMany(Vokabel, { foreignKey: { allowNull: false }, onDelete: 'CASCADE' });
User.hasMany(Training, { foreignKey: { allowNull: false }, onDelete: 'CASCADE' });
Training.hasMany(VTraining, { foreignKey: { allowNull: false }, onDelete: 'CASCADE' });
Vokabel.hasMany(VTraining, { foreignKey: { allowNull: false }, onDelete: 'CASCADE' });
UserSatz.belongsTo(User, { foreignKey: { allowNull: false }, onDelete: 'CASCADE' });
UserSatz.belongsTo(Satz, { foreignKey: { allowNull: false }, onDelete: 'CASCADE' });
Vokabel.belongsTo(Satz, { foreignKey: { allowNull: false }, onDelete: 'CASCADE' });
Training.belongsTo(User, { foreignKey: { allowNull: false }, onDelete: 'CASCADE' });
VTraining.belongsTo(Training, { foreignKey: { allowNull: false }, onDelete: 'CASCADE' });
VTraining.belongsTo(Vokabel, { foreignKey: { allowNull: false }, onDelete: 'CASCADE' });
(nicht zu lange nachdenken, der zweite Teil ist der gespiegelte erste Teil, beide bedeuten qua dasselbe)
Eine Zusammenfassung so
UserSatz.findOne({ where: { UserId: uid }, include: { model: Satz } }).then(us => {
Vokabel.findAll({ where: { SatzId: us.Satz.id }, include: { model: VTraining } }).then(vs => {
console.log('Find successfully.');
vs.forEach(v => {
var ri = 0;
var fa = 0;
v.VTrainings.forEach(vt => {
ri += vt.Richtige;
fa += vt.Falsche;
});
console.log("ERGEBNIS:", v.VA, v.VB, ri, fa, ri / (ri + fa));
});
});
}).catch(err => {
console.error('Find error:', err);
});
Wenn zB eingefügt wurde
VTraining.bulkCreate([{
TrainingId: t.id,
VokabelId: vs[0].id,
Richtige: 2,
Falsche: 2
}, {
TrainingId: t.id,
VokabelId: vs[2].id,
Richtige: 1,
Falsche: 4
}, {
TrainingId: t.id,
VokabelId: vs[2].id,
Richtige: 2,
Falsche: 4
}, {
TrainingId: t.id,
VokabelId: vs[2].id,
Richtige: 3,
Falsche: 4
}]).then(vts => {
dann ist Ausgabe
ERGEBNIS: hallo1 hello2 2 2 0.5
ERGEBNIS: wie geht es dir3 how are you4 0 0 NaN
ERGEBNIS: wetter5 weather6 6 12 0.3333333333333333
ERGEBNIS: Tschüß7 Bye8 0 0 NaN
(Nummern hinter VA und VB eingefügt, aber nicht von belang)
Dh, Vokabel 0 wurde einmal trainiert mir 2x richtig und 2x falsch === 0.5 richtig; Vokabel 2 wurde 3mal trainiert mit 6x richtig und 12x falsch === 0.333 richtig.