我有一个以前用于制作的MySQL数据库,现在我们的团队正在迁移到SailsJS。我读过关于帆的关联,我认为这很棒。但我想知道您是否可以使用关联来使用.populate
方法填充连接的表。我已经通过添加
user: {
model: 'User'
}
到我的个人资料模型。但是当我尝试使用populate方法填充它时。它会产生错误。
"error": "E_UNKNOWN",
"status": 500,
"summary": "Encountered an unexpected error",
"raw": {
"code": "ER_BAD_FIELD_ERROR",
"errno": 1054,
"sqlState": "42S22",
"index": 0
}
这是两个mysql表模式 对于用户表:
CREATE TABLE IF NOT EXISTS `user` (
`userId` int(20) NOT NULL AUTO_INCREMENT,
`email` varchar(40) NOT NULL,
`password` varchar(60) NOT NULL,
`locationId` int(20) DEFAULT NULL,
`status` tinyint(4) NOT NULL COMMENT '0 - inactive, 1 - active, 2 - delete',
`companyId` int(20) DEFAULT NULL,
`createDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`userId`),
UNIQUE KEY `email` (`email`),
KEY `fk_locationId` (`locationId`),
KEY `fk_orgId` (`companyId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=259 ;
对于个人资料表:
CREATE TABLE IF NOT EXISTS `profile` (
`profileId` int(11) NOT NULL AUTO_INCREMENT,
`firstName` varchar(30) NOT NULL,
`lastName` varchar(30) NOT NULL,
`suffix` varchar(10) DEFAULT NULL,
`nickName` varchar(25) DEFAULT NULL,
`title` varchar(45) DEFAULT NULL COMMENT 'Name Title, e.g, Dr., Engr., etc\n',
`userId` int(11) NOT NULL,
`birthDate` date DEFAULT NULL,
`phoneNumber` varchar(30) DEFAULT NULL,
`dateUpdated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`image` tinyint(1) NOT NULL DEFAULT '0',
`gender` tinyint(1) NOT NULL COMMENT '0 - female, 1 - male',
`middleName` varchar(20) DEFAULT NULL,
`telephoneNumber` varchar(30) DEFAULT NULL,
PRIMARY KEY (`profileId`),
KEY `fk_userId` (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=259 ;
ALTER TABLE `profile`
ADD CONSTRAINT `fk_userId` FOREIGN KEY (`userId`) REFERENCES `user` (`userId`) ON DELETE CASCADE ON UPDATE CASCADE;
更新
User模型
Profile模型
答案 0 :(得分:2)
看起来您可能没有使用最新版本的Sails beta(rc7),它可能为您提供了稍微好一点的错误消息(比如哪个字段导致错误)。
在任何情况下,您似乎都需要进行一些数据库迁移才能使用Sails。您可以让Waterline为您执行此操作 - 实际上,如果您的连接配置中没有migrate: safe
属性,它将默认执行此操作。但是在你的情况下,正如在迁移项目时经常这样,你已经有了一个模式,而你可能不会让Waterline搞砸它。没问题 - 我们只需要在你的模型配置中调整一些设置,你就应该好了。
在api / models / Profile.js中:
module.exports = {
autoPK: false, // don't try and add a unique ID; we already have one
autoCreatedAt: false, // don't try and add a createdAt timestamp
autoUpdatedAt: false, // don't try and add a updatedAt timestamp
attributes: {
profileId: {
type: 'integer',
primaryKey: true
},
user: {
model: 'user',
columnName: 'userId'
},
...etc...
}
}
在api / models / User.js中:
module.exports = {
autoPK: false, // don't try and add a unique ID; we already have one
autoCreatedAt: false, // don't try and add a createdAt timestamp
autoUpdatedAt: false, // don't try and add a updatedAt timestamp
attributes: {
userId: {
type: 'integer',
primaryKey: true
}
profile: {
model: 'profile',
columnName: 'profileId'
},
...etc...
}
}
请注意,Sails目前不支持真正的一对一关系,因此如果要双向填充,则必须单独链接双方。也就是说,添加user: 1
的个人资料不会让您User.findOne(1).populate('profile')
;您必须明确地在用户#1上设置profile
密钥才能使其生效。