Обновление записей и их ассоциации с sequelize - PullRequest
0 голосов
/ 05 июня 2018

У меня есть следующие модели, определенные в sequelize:

Библиотека , MediaParentDir , MediaSubDir и MediaSubDirEpisodes

Первые три содержат информацию о каталогах в системе, а последний содержит информацию о файлах в определенном каталоге в системе.

Связи таковы:

Library.MediaParentDirs = Library.hasMany(models.MediaParentDir, {onDelete: 'CASCADE'});
Library.MediaSubDirs = Library.hasMany(models.MediaSubDir, {onDelete: 'CASCADE'});

MediaParentDir.MediaSubDirs = MediaParentDir.hasMany(models.MediaSubDir, {onDelete: 'CASCADE'});

MediaSubDir.Episodes = MediaSubDir.hasMany(models.Episode, {onDelete: 'CASCADE'});

И вот как я заполняю базу данных при первом запуске:

db.Library.find({
    where: lib
}).then((existingLib) => {

    let includes = [{
            model: db.MediaParentDir,
            include: [{
                model: db.MediaSubDir,
                include: [db.Episode]
            }]
        },
        {
            model: db.MediaSubDir,
            include: [db.Episode]
        }
    ];

    let mediaParentDirs = removeIgnored(library.getMediaParentDirsFrom(lib))
        .map((parentDir) => {
            parentDir.MediaSubDirs = removeIgnored(library.getMediaSubDirsFrom(parentDir));
            parentDir.MediaSubDirs.map((subDir) => {
                subDir.Episodes = removeIgnored(library.getMediaSubDirEpisodesFrom(subDir));
                return subDir;
            });
            return parentDir;
        });


    let mediaSubDirs = removeIgnored(library.getMediaSubDirsFrom(lib))
        .map((subDir) => {
            subDir.Episodes = removeIgnored(library.getMediaSubDirEpisodesFrom(subDir));
            return subDir;
        });

    let updatedLib = db.Library.build({
        name: lib.name,
        path: lib.path,
        type: lib.type,
        // Add all media parent dirs and child sub dirs under media parent dirs
        MediaParentDirs: mediaParentDirs,
        // Add all media sub dirs directly under library
        MediaSubDirs: mediaSubDirs,
    }, {
        include: includes
    });


    if (!existingLib)
        return updatedLib.save();

    // Record already exists. Update library data.

});

В приведенном выше коде я читаю каталог библиотеки и собираю всю информацию о MediaParentDirs и других моделях, упомянутых ранее.Наконец, я создаю экземпляр библиотеки со всеми определенными вложенными ассоциациями.

Теперь, если библиотека уже существует, мне нужно обновить данные, связанные с ней и ее моделями.Я уже попробовал несколько вещей:

  • Library.upsert(), но это не обновляет ассоциации.
  • Library.update() то же, что и выше.
  • embed.update()с https://github.com/Wsiegenthaler/sequelize-embed но это требует от меня явного указания идентификаторов объектов

Можно ли каким-либо другим способом обновить связанные экземпляры модели?

Любая помощь будет оценена.Спасибо.

1 Ответ

0 голосов
/ 06 июня 2018

Автоматическая секвенция добавляет методы установки к моделям, которые можно использовать для обновления связанных данных в базе данных.

Ниже приведен код, который я использую для перечисления методов.Добавьте это в index.js после определения связей и перезапустите сервер узла.

   for (let assoc of Object.keys(db[modelName].associations)) {
    for (let accessor of Object.keys(db[modelName].associations[assoc].accessors)) {
      console.log(db[modelName].name + '.' + db[modelName].associations[assoc].accessors[accessor]+'()');
    }
...