如何使用sequelize和mysql创建一对一关系?

时间:2019-02-11 09:52:44

标签: javascript mysql orm sequelize.js relationship

我正在尝试在两个实体之间建立一对一的关系。我正在使用sequelize作为数据库mysql的ORM。

我的模型定义如下:

var user = (sequelize, DataTypes) => {                                                                               
  const User = sequelize.define('user', {                                                                            
    name: {type: DataTypes.STRING, allowNull: false, unique: true }                                                  
  }, {                                                                                                               
    timestamps: false                                                                                                
  });                                                                                                                

  return User;                                                                                                       
};                                                                                                                   

var product = (sequelize, DataTypes) => {                                                                            
  const Product = sequelize.define('product', {                                                                      
    title: {type: DataTypes.STRING, allowNull: false, unique: true, default: 'Coop Default' }                        
  }, {                                                                                                               
    timestamps: false                                                                                                
  });                                                                                                                

  return Product;                                                                                                    
};                                                                                                                   

和下面的代码行一对一的关系

db.product.belongsTo(db.user);                                                                                       
db.user.hasOne(db.product);  

但是,这不会在表products中创建唯一的外键。

mysql> desc products;
+--------+--------------+------+-----+---------+----------------+
| Field  | Type         | Null | Key | Default | Extra          |
+--------+--------------+------+-----+---------+----------------+
| id     | int(11)      | NO   | PRI | NULL    | auto_increment |
| title  | varchar(255) | NO   | UNI | NULL    |                |
| userId | int(11)      | YES  | MUL | NULL    |                |
+--------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

在ORM中我还应该做些什么以确保userId是唯一的?

1 个答案:

答案 0 :(得分:0)

通过在模型定义中提到它,我可以对ForeignKey强制使用unique约束,显然,sequelize不能从关联中做到这一点。

var product = (sequelize, DataTypes) => {                                                                            
  const Product = sequelize.define('product', {                                                                      
    title: { type: DataTypes.STRING,                                                                                 
             allowNull: false,                                                                                       
             unique: true                                                                                            
           },                                                                                                        

    userId: { type: DataTypes.INTEGER,                                                                                  
           allowNull: false,                                                                                         
           unique: true                                                                                              
         }                                                                                                           
  }, {                                                                                                               
    timestamps: false                                                                                                
  });                                                                                                                

  return Product;                                                                                                    
};