如何在 Sails js waterline 数据库关系中设置主键

How to set Primary keys in Sails js waterline database relationships

我一直在研究官方文档中与 sails JS 水线数据库的关系。然而,我一直难以理解我应该如何设置我的外键,就像我在正常 mysql 关系中所做的那样。 请注意,在问这个问题之前,我已经阅读了这里的文档 https://sailsjs.com/documentation/concepts/models-and-orm/associations

假设我有一个模型 PersonalInfo.js

module.exports = {

  attributes: {

    fullName:{
      type: 'string',
      required: true
    },

    phone:{
     type: 'string',
     required: true
   },

   location:{
     type: 'string',
     required: true
   },

   age:{
     type: 'integer',
     required: true
   },

   email:{
     type: 'string',
     required: true
   },

   gender:{
    type: 'string',
    required: true
  },

  userId:{
    type: 'integer',
    required: true,
  }
  
  },

};

我还有另一个模型 Archived.js 看起来像这样

module.exports = {

  attributes: {
    userId: {
      type: 'number',
      required: true,
      //unique: true,
    },
    comment:{
      type: 'string',
      required: true
    },
    createdBy:{
      type: 'number',
      required: true
    }
    
  },

};

一个归档项目有一个 personalInfo。完全了解两个模型都包含 userId 属性,我想像这样获取具有相关 personalInfo 的存档项目,我如何关联主键?

var archived = Archived.find().populate('personal');

默认情况下,sails 将生成主键 id 如果您不指定任何主键。

如果你想自定义数据作为你的主键,你可以覆盖模型中的 id 属性并给出一个 columnName

id: {
  type: 'string',
  columnName: 'email_address',
  required: true
}

然后您可以使用以下方法查找记录:

await User.find({ id: req.param('emailAddress' });

Reference

在你的情况下,似乎每个 archived 都有一个 personalInfo。所以这是 archived 方面的 one to one,但是 personalInfo 方面的 one to many。要对这些关系进行建模,您可以在 sails 中执行以下操作:

personalInfo.js

module.exports = {

  attributes: {

    fullName:{
      type: 'string',
      required: true
    },

    phone:{
     type: 'string',
     required: true
   },

   location:{
     type: 'string',
     required: true
   },

   age:{
     type: 'integer',
     required: true
   },

   email:{
     type: 'string',
     required: true
   },

   gender:{
    type: 'string',
    required: true
  },

  userId:{
    type: 'integer',
    required: true,
  },
  archives: {
    collection: 'archived',
    via: 'info'
  }

  },

};

archived.js

module.exports = {

  attributes: {
    userId: {
      type: 'number',
      required: true,
      //unique: true,
    },
    comment:{
      type: 'string',
      required: true
    },
    createdBy:{
      type: 'number',
      required: true
    },

    info: {
      model: 'personalinfo'  // sails works with small cases internally for models
    }

  },

};

执行此操作后,创建 archive 将是:

await Archive.create({
  ...

  // Set the User's Primary Key to associate the info with the archive.
  info: 123
});

现在您终于可以在查询时填充 info

var archived = Archived.find().populate('info');