Sequelize.js中的'belongsTo'与'hasMany'

khe*_*hex 52 sql orm node.js sequelize.js

B.belongsTo(A)和之间的区别是什么A.hasMany(B)

Artist = sequelize.define('Artist', {});
Album = sequelize.define('Albums', {});

Album.belongsTo(Artist, foreignKey: 'album_belongsl_artist');
Artist.hasMany(Album, foreignKey: 'artist_hasmany_albums');
Run Code Online (Sandbox Code Playgroud)

如果它在两种情况下都创建了依赖表Album

Jan*_*ier 90

当您这样做时,Album.belongsTo(Artist)您正在创建允许您呼叫的关系album.getArtist().Artist.hasMany(Album)以其他方式链接关联,使您可以调用artist.getAlbums().如果你只做了这两个中的一个,例如,如果你只这样做,Album.belongsTo(Artist)你将能够检索一个专辑的艺术家,但不能找到一个艺术家的所有专辑.

但请注意,由于示例中给出了外键,因此您实际上是在创建两个关系.生成的表如下所示:

CREATE TABLE IF NOT EXISTS `Albums` (`id` INTEGER NOT NULL auto_increment , `album_belongsl_artist` INTEGER, `artist_hasmany_albums` INTEGER, PRIMARY KEY (`id`))
Run Code Online (Sandbox Code Playgroud)

如果您只想要一个关联,则foreignKey应该相同.例:

Album.belongsTo(Artist, {foreignKey: 'artist_id'});
Artist.hasMany(Album,{ foreignKey: 'album_id'});
Run Code Online (Sandbox Code Playgroud)

产生:

CREATE TABLE IF NOT EXISTS `Albums` (`id` INTEGER NOT NULL auto_increment , `album_id` INTEGER, PRIMARY KEY (`id`)) ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)

  • 经过一个小时的拖网搜索文档试图找出如何做到这一点,你的代码帮助了很多!现在有一个很好的双向1:m协会.好极了! (3认同)
  • 我有一个类似的问题,我只是想知道如何使关系反向工作.我拿了一个艺术家并在上面调用了getAlbums,效果很好.但是当我从结果中使用一个Album项目并在其上执行``getArtists``时,它只返回``null``.怎么解决这个问题?因为``getArtist``方法是由sequelize提供的. (2认同)
  • 是否可以添加两种关系?或者这会导致任何冲突吗? (2认同)
  • 不应该是这样的; 注意`foreignKey`值是**artist_id**(vs**album_id**):`Album.belongsTo(Artist,{foreignKey:'artist_id'});`就像Sequelize文档中有`City.belongsTo(Country, {foreignKey:'countryCode'})`.换句话说,函数`belongsTo`是... 1)调用*on*模型/表,它添加*引用*列(即源;相册或城市)2)调用*与*模型/表其中*引用*ID(艺术家或国家)3)使用`foreignKey`调用,该列的名称从#1到#2(artist_id,countryCode) (2认同)
  • 两个语句都不应该都具有ForeignKey:'artist_id'吗?因为1位艺术家有很多专辑,而且想法是FK相同 (2认同)