1

私はbookshelf.jsにかなり慣れていないので、ご容赦ください。

私は学んでいるので、MySQL を使用しており、非常に単純な構造になっています。つまり、1 つのセカンダリ キーを持つ 2 つのエンティティです。これが私の構造です:

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 (外部キー) と比較しないのですか?

お時間とご回答ありがとうございます。

4

1 に答える 1

1

次のようにして動作させることができます。

1.) 主キーの名前を主キーに変更しidます。主キーはcity.idではなくである必要がありcity.city_idます。

2.) ユーザー定義の関係を次のように変更します。return this.belongsTo(City);

3.) 次のようにして都市にアクセスできますnew User({id: 1}).fetch({ withRelated: ['city'] });

于 2015-02-24T20:20:07.663 に答える