Sequelize:错误:错误:Table1 未关联到 Table2

本教程将介绍Sequelize:错误:错误:Table1 未关联到 Table2的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

Sequelize:错误:错误:Table1 未关联到 Table2 教程 第1张

问题描述

我正在尝试使用 sequelize 创建以下关联,但我不断收到以下错误错误:错误:客户未与订单关联!".根据我在文档中找到的内容,我有双向关联.我对问题可能是什么感到困惑,因为当我查看数据库表时,我可以看到外键.对于此示例,我试图提取与特定订单关联的订单和客户.从技术上讲,我可以执行三个单独的 db pull,但与连接相比,这似乎效率低.

'use strict';

module.exports = function(sequelize, DataTypes) {
  var user = sequelize.define('user', {
 username: DataTypes.STRING(30), //remove
 password: DataTypes.STRING(255),
 emailaddress: DataTypes.STRING(255),
 firstname: DataTypes.STRING(30),
 middlename: DataTypes.STRING(30), //remove
 lastname: DataTypes.STRING(30),
 approve: DataTypes.BOOLEAN,
 roles: DataTypes.STRING(50),
 isactive: DataTypes.BOOLEAN
  }, {
 classMethods: {
associate: function(models) {
  // associations can be defined here
  this.hasMany(models.order);
}
 }
  });

  user.hook('afterCreate', function(usr, options) {
//hash the password

return user.update({ password: passwd }, {
  where: {
 id: usr.id
  }
});
  });

  return user;
};



'use strict';
module.exports = function(sequelize, DataTypes) {
  var order = sequelize.define('order', {
 ponumber: DataTypes.STRING(30), //remove
 orderdate: DataTypes.DATE,
 shippingmethod: DataTypes.STRING(30),
 shippingterms: DataTypes.STRING(30),
 deliverydate: DataTypes.DATE,
 paymentterms: DataTypes.STRING(30),
 overridediscount: DataTypes.BOOLEAN,
 shippingaddress: DataTypes.STRING(30),
 shippingcity: DataTypes.STRING(30),
 shippingstate: DataTypes.STRING(20),
 shippingzipcode: DataTypes.STRING(10),
 isactive: DataTypes.BOOLEAN
  }, {
associate: function(models) {
  // associations can be defined here
  this.belongsTo(models.user);
  this.belongsTo(models.customer);
}
  });

  order.hook('afterCreate', function(ord, options) {
//generate po number

return order.update({ ponumber: ponumbr }, {
  where: {
 id: ord.id
  }//,
  //transaction: options.transaction
});
  });

  return order;
};


'use strict';
module.exports = function(sequelize, DataTypes) {
  var customer = sequelize.define('customer', {
 customernumber: DataTypes.STRING(30), //remove
 customerspecificationid: DataTypes.INTEGER,
 customertypeid: DataTypes.INTEGER,
 sportid: DataTypes.INTEGER,
 customername: DataTypes.STRING(20), //remove
 address: DataTypes.STRING(30),
 city: DataTypes.STRING(30),
 state: DataTypes.STRING(30),
 zipcode: DataTypes.STRING(30),
 ordercomplete: DataTypes.BOOLEAN,
 isactive: DataTypes.BOOLEAN
  }, {
associate: function(models) {
 // associations can be defined here
  this.hasMany(models.order);
}
  });

  customer.hook('afterCreate', function(cust, options) {
//generate the customer number

  return customer.update({ customernumber: custnumber }, {
  where: {
 id: cust.id
  }
});
  });

  return customer;
};


Here is the constructor and method inside of a repository class I want to join 

constructor(model){
 super(model.order);
 this.currentmodel = model;
}


findById(id){
 let that = this;
 return new Promise(
  function(resolve, reject) {
that.model.find({
 where: { id: id },
 include: [ that.currentmodel.customer, that.currentmodel.user ]
})
.then(function(order){
 resolve(order);
})
.catch(function(err){
 reject(err);
})
 });
}

我已查看文档并在互联网上搜索以寻找解决此问题的方法,但我没有找到任何答案.有人可以阐明我可能缺少的东西吗?

对于上面的示例,我试图通过主键检索绑定到订单记录的用户和客户.到目前为止,我发现的所有 findBy 场景都是获取与客户和用户相关的订单列表.为了检索外键与该订单相关联的订单和客户,我需要进行哪些更改?

推荐答案

问题可能在于你怎么设置关联,请提及你的策略.

如果您使用 express index.js 文件设置然后查询 http://docs.sequelizejs.com/en/1.7.0/articles/express/

'use strict';
module.exports = function(sequelize, DataTypes) {
  var customer = sequelize.define('customer', {
 customernumber: DataTypes.STRING(30), //remove
 customerspecificationid: DataTypes.INTEGER,
 customertypeid: DataTypes.INTEGER,
 sportid: DataTypes.INTEGER,
 customername: DataTypes.STRING(20), //remove
 address: DataTypes.STRING(30),
 city: DataTypes.STRING(30),
 state: DataTypes.STRING(30),
 zipcode: DataTypes.STRING(30),
 ordercomplete: DataTypes.BOOLEAN,
 isactive: DataTypes.BOOLEAN
  }, {
associate: function(models) {
 // associations can be defined here
  models.customer.hasMany(models.order);
}
  });

  customer.hook('afterCreate', function(cust, options) {
//generate the customer number

  return customer.update({ customernumber: custnumber }, {
  where: {
 id: cust.id
  }
});
  });

  return customer;
};


'use strict';
module.exports = function(sequelize, DataTypes) {
  var order = sequelize.define('order', {
 ponumber: DataTypes.STRING(30), //remove
 orderdate: DataTypes.DATE,
 shippingmethod: DataTypes.STRING(30),
 shippingterms: DataTypes.STRING(30),
 deliverydate: DataTypes.DATE,
 paymentterms: DataTypes.STRING(30),
 overridediscount: DataTypes.BOOLEAN,
 shippingaddress: DataTypes.STRING(30),
 shippingcity: DataTypes.STRING(30),
 shippingstate: DataTypes.STRING(20),
 shippingzipcode: DataTypes.STRING(10),
 isactive: DataTypes.BOOLEAN
  }, {
associate: function(models) {
  // associations can be defined here
  models.order.belongsTo(models.user);
  models.order.belongsTo(models.customer);
}
  });

  order.hook('afterCreate', function(ord, options) {
//generate po number

return order.update({ ponumber: ponumbr }, {
  where: {
 id: ord.id
  }//,
  //transaction: options.transaction
});
  });

  return order;
};

'use strict';

module.exports = function(sequelize, DataTypes) {
  var user = sequelize.define('user', {
 username: DataTypes.STRING(30), //remove
 password: DataTypes.STRING(255),
 emailaddress: DataTypes.STRING(255),
 firstname: DataTypes.STRING(30),
 middlename: DataTypes.STRING(30), //remove
 lastname: DataTypes.STRING(30),
 approve: DataTypes.BOOLEAN,
 roles: DataTypes.STRING(50),
 isactive: DataTypes.BOOLEAN
  }, {
 classMethods: {
associate: function(models) {
  // associations can be defined here
  models.user.hasMany(models.order);
}
 }
  });

  user.hook('afterCreate', function(usr, options) {
//hash the password

return user.update({ password: passwd }, {
  where: {
 id: usr.id
  }
});
  });

  return user;
};

//关联路由的 index.js 文件

var fs  = require('fs')
 , path= require('path')
 , Sequelize = require('sequelize')
 , lodash = require('lodash')
 , sequelize = new Sequelize('sequelize_test', 'root', 'root')
 , db  = {} 

  fs.readdirSync(__dirname)
 .filter(function(file) {
return (file.indexOf('.') !== 0) && (file !== 'index.js')
 })
 .forEach(function(file) {
var model = sequelize.import(path.join(__dirname, file))
db[model.name] = model
 })

  Object.keys(db).forEach(function(modelName) {
 if (db[modelName].options.hasOwnProperty('associate')) {
db[modelName].options.associate(db)
 }
  })
  // sequelize.sync({force: true})
  module.exports = lodash.extend({
 sequelize: sequelize,
 Sequelize: Sequelize
  }, db)

将上面的数据库代码放在db文件夹中的相应文件中或任何您喜欢的名称中,然后您就可以使用您的查询

var db = require('./db');

db.order.find({
where: { id: 0 },
include: [ db.customer, db.user ]
  })
  .then(function(order){
console.log(order)
  })

好了关于Sequelize:错误:错误:Table1 未关联到 Table2的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。