Sequelize - findOrCreate 在“through”表上、belongsToMany 关联上

2023-12-02

首先,我对 Node.JS 相当陌生,对 Sequelize 甚至更陌生,这已经困扰我一段时间了。我有以下模型实体:

Match.js

module.exports = function(sequelize, DataTypes) {
    var Match = sequelize.define('Match', {
            matchId: {
                type: DataTypes.BIGINT,
                field: 'match_id'
            },
            server: {
            type: DataTypes.STRING
            },
            (...)
            rankedBoo: {
                type: DataTypes.BOOLEAN,
                field: 'ranked_boo'
            }
    }, {
        classMethods: {
            associate: function(models) {
                Match.belongsToMany(models.Summoner, {as: 'Participants', through: 'SummonerMatch'});
            }
        },
        freezeTableName: true,
        underscored: true
    });

  return Match;
};

召唤师.js

module.exports = function(sequelize, DataTypes) {
  var Summoner = sequelize.define('Summoner', {
        summonerId: {
            type: DataTypes.INTEGER,
            field: 'summoner_id'
        },
        server: {
            type: DataTypes.STRING
        },
        summonerName: {
            type: DataTypes.STRING,
            field: 'summoner_name'
        },
        mainChampion: {
            type: DataTypes.INTEGER,
            field: 'main_champion'
        }
    }, {
        classMethods: {
            associate: function(models) {
                Summoner.belongsToMany(models.Match, {as: 'SummonerMatches', through: 'SummonerMatch'});
                Summoner.hasOne(models.RankedStats);
                Summoner.hasMany(models.RankedHistory, { as: { singular: 'RankedHistory', plural: 'RankedHistory' }});
            }
        },
        freezeTableName: true,
        underscored: true
    });


  return Summoner;
};

SummonerMatch.js

module.exports = function(sequelize, DataTypes) {
    var SummonerMatch = sequelize.define('SummonerMatch', {
        championId: {
            type: DataTypes.INTEGER,
            field: 'champion_id'
        },
        role: {
            type: DataTypes.STRING
        },
        (...)
        sightWardsBought: {
            type: DataTypes.INTEGER,
            field: 'sight_wards_bought'
        }
    }, {
        freezeTableName: true,
        underscored: true
    });

  return SummonerMatch;
};

现在我正在尝试创建一个新的匹配,并将其与召唤师关联起来,我正在执行以下操作:

summoner.createSummonerMatch(matchInfo, matchDetails).then(
    function () {
        callback();
        return null;
});

Where 比赛信息包含“Match”实体的属性,以及比赛详情包含“SummonerMatch”实体的属性。

这很好,但它不会检查匹配是否已经存在,所以我尝试使用查找或创建 here.

models.Match.findOrCreate({
    include: [ {model: models.Summoner, as: 'Participants'}],
    where: { matchId: matchInfo.matchId, server: matchInfo.server },
    defaults: {
        matchMode: queueType,
        matchDate: new Date(matchCreation),
        matchDuration: matchDurationInSeconds,
        rankedBoo: rankedBoo
        }
    }).spread(function(match, created) {
        console.log(created)
});

这几乎成功了(在 Match 表中创建一个新行,但不在 SummonerMatch 中创建)。我该如何将信息插入 SummonerMatch 中?尝试了一些事情(向默认值添加属性、将其切换到数组、使用包含进行调整,但到目前为止没有成功。

我可能错过了一些东西,但我不知道是什么。任何帮助深表感谢 :)

[编辑] 如果有人来这里寻找如何做到这一点的答案,这可行,但我不确定这是否是最好的方法:

models.Match.findOrCreate({
    include: [ {model: models.Summoner, as: 'Participants'}],
    where: { matchId: matchInfo.matchId, server: matchInfo.server },
    defaults: {
        matchMode: queueType,
        matchDate: new Date(matchCreation),
        matchDuration: matchDurationInSeconds,
        rankedBoo: rankedBoo
        }
    }).spread(function(match, created) {
        match.addParticipant(summoner, matchDetails).then(
            function () {
                console.log('Done')
            }
        )
});

如果匹配不存在,它将创建一个匹配,然后添加一个参与者。难道就没有办法一次完成这一切吗?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sequelize - findOrCreate 在“through”表上、belongsToMany 关联上 的相关文章

随机推荐

  • 在不同的 Activity 或 Fragment 之间共享数据的正确方法是什么?

    我需要一个应该具有 UI 工作流程的应用程序 其中用户应该能够浏览应用程序的特定部分 可以是 ListView 或 GridView 并且他可以点击某个项目以显示该特定项目的详细信息 现在 如果用户向右滑动 即ViewPager 视图分页器
  • 更改 lubridate 函数以从星期一而不是星期日开始

    dates lt NULL date lt as Date 01 01 2014 d m Y dates lt data frame date as Date character cal day in year num numeric ca
  • 将大文本文件添加到资产文件夹

    我正在开发一个 Android 2 2 应用程序 我想向 Android 项目添加一些大文本文件 4 5MB 或更多 首先我不知道是否可以将此类大文件添加到资产文件夹中 但是 如果可以的话 是否可以压缩它们 如何压缩文件 并解压 还有其他更
  • 如何从 WebAPI 传递 pdf 并从 MVC 控制器读取 pdf?

    我有一个 Web API 服务 应该返回 PDF 然后我尝试调用该 WebAPI 方法来读取 PDF 这是我的 API 方法 HttpPost Route GetTestPDF public HttpResponseMessage Test
  • Git 推送问题

    我有一个从 github 上新克隆的存储库 地址是git github com JoshClose CsvHelper git如果你想尝试一下 我正在使用 tortoisegit 但如果需要的话 我会使用命令行来解决这个问题 我可能需要稍微
  • 如何动态改变webView的高度?

    我目前正在使用webView来显示新闻 在新闻下面我打算放一些按钮 所以我需要获取webView的高度 以便在所有下载后根据webView的高度改变按钮的位置 在其他那么 如何动态改变webView的高度呢 try this void we
  • ref($variable) 何时返回“IO”?

    这是文档的相关摘录ref功能 返回的值取决于引用所引用的事物的类型 内置类型包括 SCALAR ARRAY HASH CODE REF GLOB LVALUE FORMAT IO VSTRING Regexp 基于此 我想象调用ref在文件
  • Google Cloud Kubernetes Ingress 静态 IP 地址未反映且与设置不同

    我正在尝试在 Google Cloud 上使用 GKE 部署完整的 Web 应用程序 后端为 Nodejs 前端为 Angular 然后为其启用 SSL 我创建了一个全局 IP 地址 随后在列表中看到了它 gcloud 计算地址创建 mat
  • WCF工作流服务REST接口[重复]

    这个问题在这里已经有答案了 可能的重复 WF4 WCF 中的 RESTful 工作流服务端点 我正在尝试使 Windows Workflow Services 4 0 使用 REST 接口 我有一个非常简单的工作流服务 名为 Service
  • 加载谷歌地图时,Safari v5 隐藏 div

    我在 Mac 上使用 Safari v5 时遇到问题 当我的 Google Map Api 加载到页面中时 它隐藏了我的一些其他 div 它们是绝对定位的 在地图加载之前 页面会正确呈现 如果我有一个没有地图的页面 则不会发生问题 例子 w
  • 如何在运行时设置 JTextField 的宽度?

    有人可以帮我如何设置 a 的宽度吗JTextField在运行时 我希望在运行时调整我的文本字段的大小 它将询问用户长度 然后输入将更改文本字段的宽度 if selectedComponent instanceof javax swing J
  • 我正在尝试获取唯一的 CPU ID

    我使用下面的代码来获取唯一的 CPU ID 我在网上找到了使用此代码的各种示例 然而 一个偶然的机会 我碰巧拥有两台华硕笔记本电脑 一个是四核 i5 另一个是重型 i7 八核 两者都是 64 位机器 令我大吃一惊的是 它们都产生相同的 唯一
  • 如何在Powershell中解压文件?

    我有一个 zip文件 需要使用 Powershell 解压其全部内容 我正在这样做 但它似乎不起作用 shell New Object ComObject shell application zip shell NameSpace C a
  • 如何无限期删除 PouchDB 数据库以释放空间?

    如何删除 PouchDB 中的数据库以再次释放磁盘空间 删除仅设置参数 deleted 并保留记录的数据 但是 如何才能以真正删除记录并节省一些空间的方式删除记录呢 因为我想时不时地重置数据库 这样它就不会变得太大 听起来您正在寻找压实 它
  • 如何在asp.net中显示警告框

    我有一个带有提交按钮的注册页面 我想在 用户单击提交按钮 时显示一个警报框 然后 用户输入的数据被插入到数据库中 int i obj IU SubscriberMaster 0 txtFirstname Text txtLastname T
  • Python删除输入行

    我想在 python 3 中有一个输入循环 其中输入的信息会自动从终端删除 f eks 3秒后 我知道 r 的功能可以返回行 但在输入后很难自动换行 while True inputStr input Add the hidden word
  • 如何使用案例删除mysql中的重复项

    现在我正在使用类似的方法来删除 mysql 表中的重复项 delete t2 from my table1 as t1 my table1 as t2 where t1 TestCase t2 TestCase and t2 id gt t
  • 为 Razor 调整自定义 Html Helper(它使用 HtmlTextWriter 因此返回 void)

    问题 我有一个为 WebFormViewEngine 视图编写的非常漂亮的菜单 Html 帮助器 该引擎允许您的助手返回 void 但仍然能够使用 Html Theseus 这对我的助手来说非常有用 因为它可以使用 HtmlTextWrit
  • Python:使用批量 API V3 将订阅者添加到 mailchimp

    我试图编写一个函数来在 mailchimp 中创建订阅者 但出现错误 并且我不明白出了什么问题 我在用着python mailchimp 是的 我有正确的列表 ID 而不是 000000 My code from mailchimp3 im
  • Sequelize - findOrCreate 在“through”表上、belongsToMany 关联上

    首先 我对 Node JS 相当陌生 对 Sequelize 甚至更陌生 这已经困扰我一段时间了 我有以下模型实体 Match js module exports function sequelize DataTypes var Match