Bookshelf.js – hasOne关系不好

我对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,使用bookshelf:

 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:

 {} 

我已经启用了书架上的debugging模式,这是它试图执行的查询:

  { __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'] });访问城市new User({id: 1}).fetch({ withRelated: ['city'] });