Bookshelf.js - hasOne 关系运行不正常
Bookshelf.js - hasOne relationship not working well
我是 bookshelf.js 的新手,所以请多多包涵。
自从我学习以来,我一直在使用 MySQL 并且结构非常简单。即,两个实体,具有一个辅助键。这是我的结构:
CREATE TABLE IF NOT EXISTS `city` (
`city_id` int(11) NOT NULL,
`code` int(11) NOT NULL,
`name` varchar(255) COLLATE utf8_bin NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE IF NOT EXISTS `people` (
`people_id` int(11) NOT NULL,
`city_id` int(11) NOT NULL,
`name` varchar(255) COLLATE utf8_bin NOT NULL,
`age` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
ALTER TABLE `city`
ADD PRIMARY KEY (`city_id`);
ALTER TABLE `people`
ADD PRIMARY KEY (`people_id`), ADD KEY `city_id` (`city_id`);
ALTER TABLE `people`
ADD CONSTRAINT `people_ibfk_1` FOREIGN KEY (`city_id`) REFERENCES `city` (`city_id`);
这是我在 expressjs 中使用书架的代码:
var City = bookshelf.Model.extend({
tableName: 'city'
});
var User = bookshelf.Model.extend({
tableName: 'people',
city: function(){
return this.hasOne(City, 'city_id');
}
});
这是我如何 运行 我的查询的示例代码:
new User().where({people_id: req.params.id })
.city()
.fetch()
.then(function(user){
res.send(user.toJSON());
})
.catch(function(error){
res.send(error);
});
然而,当我 运行 应用程序时,除了一个空 json:
{}
我在 bookshelf 中启用了调试模式,这是它尝试执行的查询:
{ __cid: '__cid1',
method: 'select',
options: undefined,
bindings: [ undefined, 1 ],
sql: 'select `city`.* from `city` where `city`.`city_id` = ? limit ?' }
正如我所说,我是书架新手。但这是没有意义的;为什么不比较 city.city_id 和 person.city_id(外键)?
感谢您的宝贵时间和回答!
您可以通过执行以下操作使其正常工作:
1.) 将主键主键重命名为id
。主键应该是 city.id
,而不是 city.city_id
。
2.) 将用户定义中的关系更改为return this.belongsTo(City);
3.) 您可以通过 new User({id: 1}).fetch({ withRelated: ['city'] });
访问城市
我是 bookshelf.js 的新手,所以请多多包涵。
自从我学习以来,我一直在使用 MySQL 并且结构非常简单。即,两个实体,具有一个辅助键。这是我的结构:
CREATE TABLE IF NOT EXISTS `city` (
`city_id` int(11) NOT NULL,
`code` int(11) NOT NULL,
`name` varchar(255) COLLATE utf8_bin NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE IF NOT EXISTS `people` (
`people_id` int(11) NOT NULL,
`city_id` int(11) NOT NULL,
`name` varchar(255) COLLATE utf8_bin NOT NULL,
`age` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
ALTER TABLE `city`
ADD PRIMARY KEY (`city_id`);
ALTER TABLE `people`
ADD PRIMARY KEY (`people_id`), ADD KEY `city_id` (`city_id`);
ALTER TABLE `people`
ADD CONSTRAINT `people_ibfk_1` FOREIGN KEY (`city_id`) REFERENCES `city` (`city_id`);
这是我在 expressjs 中使用书架的代码:
var City = bookshelf.Model.extend({
tableName: 'city'
});
var User = bookshelf.Model.extend({
tableName: 'people',
city: function(){
return this.hasOne(City, 'city_id');
}
});
这是我如何 运行 我的查询的示例代码:
new User().where({people_id: req.params.id })
.city()
.fetch()
.then(function(user){
res.send(user.toJSON());
})
.catch(function(error){
res.send(error);
});
然而,当我 运行 应用程序时,除了一个空 json:
{}
我在 bookshelf 中启用了调试模式,这是它尝试执行的查询:
{ __cid: '__cid1',
method: 'select',
options: undefined,
bindings: [ undefined, 1 ],
sql: 'select `city`.* from `city` where `city`.`city_id` = ? limit ?' }
正如我所说,我是书架新手。但这是没有意义的;为什么不比较 city.city_id 和 person.city_id(外键)?
感谢您的宝贵时间和回答!
您可以通过执行以下操作使其正常工作:
1.) 将主键主键重命名为id
。主键应该是 city.id
,而不是 city.city_id
。
2.) 将用户定义中的关系更改为return this.belongsTo(City);
3.) 您可以通过 new User({id: 1}).fetch({ withRelated: ['city'] });