2015-02-24 60 views
1

我对bookshelf.js相当陌生,请耐心等待。Bookshelf.js - hasOne的关系不太好

因为我在学习,所以我使用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:

{} 

我已经启用在书架调试模式,这是它试图执行查询:

{ __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

你可以得到它通过执行以下工作:

1)重命名主键主键id。主键应该是city.id,而不是city.city_id

2)更改用户定义return this.belongsTo(City);

3的关系),您可以通过执行new User({id: 1}).fetch({ withRelated: ['city'] });

+0

如何进入市区约不改变模式? – 2015-12-21 19:46:28

+1

您可以使用idAttribute属性在模型中定义主键(如果它不是“id”):http://bookshelfjs.org/#Model-instance-idAttribute – 2016-01-29 19:36:34