mysql - 在 sequelize 中声明关系?

标签 mysql node.js sequelize.js

我有三个模型,我试图定义它们之间的关系。

模型: 用户 支付 债务人

  • 用户有很多付款
  • 付款属于用户
  • 付款有很多债务人
  • Debtor属于Payment
  • Debtor属于Payment

我需要在源和目标中定义关系吗?即

User.hasMany(Payment, {as: 'Payments'})

还有

Payment.belongsTo(User)

或者我可以只在一个模型中定义它吗?

尝试在两者中定义它时,我似乎都遇到了错误。我导入的模型是 undefined,因此当我尝试将它传递给“belongsTo()”或“hasMany()”函数时,出现错误 called with something that's not an instance of Sequelize .型号

当我只将它包含在一个模型中时,它不会正确地创建关系。

我的模型如下:

支付模式:

import { sequelize } from '../config';
import Sequelize from 'sequelize';
import User from './User';


const Payment = sequelize.define('payment', {
  amount: {
    type: Sequelize.FLOAT
  },
  reference: {
    type: Sequelize.STRING
  },
  user_id: {
    type: Sequelize.INTEGER
  }
});

Payment.belongsTo(User)


export default Payment;

用户模型:

import { sequelize } from '../config';
import Sequelize from 'sequelize';
import Payment from './Payment';

const User = sequelize.define('user', {
  email: {
    type: Sequelize.STRING
  },
  username: {
    type: Sequelize.STRING
  },
  firstName: {
    type: Sequelize.STRING
  },
  lastName: {
    type: Sequelize.STRING
  },
  facebookID: {
    type: Sequelize.STRING
  }
});

User.hasMany(Payment, {as: 'Payments'})

export default User;

//编辑

当我尝试使用付款创建新用户时,我收到错误消息 payment is not associated to user!

exports.create = (req, res) => {

    User.create({
      email: 'test3@gmail.com',
        firstName: "Test",
        lastName: "Test",
        username: 'fnord',
      payment: [
        { amount: 10.00},
      ]
    }, {
      include: [ Payment ]
    })
}

最佳答案

发生这种情况是因为在payment 中您需要User 模型,反之亦然,在user 中您需要Payment (循环依赖)。为了避免这种情况,您必须在同一个文件中声明两个模型,或者您可以遵循 Sequelize 推荐的方式

module.exports = (sequelize, DataTypes) => {

    return sequelize.define('modelName', {
        // attributes
    }, {
        // additional options, like classMethods in which you could create the association
        classMethods: {
            associate: function(models) {
                this.belongsTo(models.Model);
                this.hasMany(models.Model);
            }
        }
    });
}

为了实现它,您必须使用 sequelize-cli模块。如果安装它,您可以使用 sequelize init 命令生成一个文件,该文件将所有模型注册到 sequelize(所有这些模型最初都在一个位置,但是您可以通过修改自动生成的文件来更改它文件)。

在这种情况下,sequelize 遍历每个模型,注册它(使用 sequelize.import() 方法)并调用创建模型之间关系的 associate 函数。这样可以避免您提到的情况。

关于mysql - 在 sequelize 中声明关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42504508/

相关文章:

node.js - 带有 Mongoose EXEC() 函数异步/等待的 typescript

sql - sequelize.js $like 运算符中的 % 符号是什么意思?

javascript - 如何通过 URL 将数据 POST 到数据库?

php - php 中下拉框中选项标签的 while 循环不起作用

php - 我应该在 SQL 还是 JS 中为 d3 过滤我的数据

javascript - 使用 WebStorm 文件夹中的闭包缩小所有 js 文件

javascript - import from 'events' 与 import {EventEmitter} from 'events' 有什么区别?

express - JSONAPI 指定的访客和授权用户的序列化器 `User` 模型的最佳实践是什么?

php - 如何在 PHP/MYSQL 中获取 DISTINCT ID 值?

mysql - SQL 不查询文本数据