【问题标题】:SailsJS Association on MYSQLMYSQL 上的 SailsJS 关联
【发布时间】:2014-05-19 07:58:27
【问题描述】:

我有一个以前用于生产的 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模特

【问题讨论】:

  • 看看the docs。您的语法错误; model 属性应该是一个字符串,它是要关联的模型的标识,例如model: 'user'
  • 哦,是的。我只是忘了在用户上加上撇号。但不是。还是不行。
  • 必须是小写的user。是小写的吗?另外,您可以发布您看到的错误吗?
  • 无论如何,我不认为大小写是问题,因为我将模型的第一个字母指定为大写。
  • 这很重要。除非您在模型定义中专门设置了 identity 属性,否则无论全球化类名是什么,模型标识都是小写的。

标签: mysql associations sails.js


【解决方案1】:

看起来您可能没有使用最新版本的 Sails 测试版 (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 键才能使其正常工作。

【讨论】:

  • 能否请您解释一下这句话:you'll have to set the profile key on user #1 explicitly in order for that to work. 对不起,我对风帆有点陌生。那么这是否意味着User.findOne(1).populate('profile') 仍然不起作用?
  • 上面的代码将使您能够在 Sails 中与您当前的数据库使用关联。我只是注意到,对于userId 设置为1 的 个人资料记录,您可以执行Profile.findOne([new profile id]).populate('user'),但您不会自动执行User.findOne(1).populate('profile')。为了使它起作用,您仍然需要将用户#1 的profileId 更新为新的个人资料记录; Waterline 不会为您这样做。这与多对一或多对多关联不同,您可以使用via 键指定反向关联。
  • Sails 协会的完整文档here.
  • 感谢您的回答和链接,顺便说一句,您提供的示例是真的这样还是您碰巧将两者互换了?我还更新了我的个人资料和用户模型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
相关资源
最近更新 更多