如何在 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' });
在你的情况下,似乎每个 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');
我一直在研究官方文档中与 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' });
在你的情况下,似乎每个 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');