【问题标题】:belongsTo vs hasMany in Sequelize.jsSequelize.js 中的 belongsTo 与 hasMany
【发布时间】:2013-11-29 17:29:27
【问题描述】:

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');

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

【问题讨论】:

    标签: sql node.js orm sequelize.js


    【解决方案1】:

    当您执行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`))
    

    如果你只想要一个关联,foreignKey 应该是一样的。

    例子:

    Album.belongsTo(Artist, {foreignKey: 'artist_id'});
    Artist.hasMany(Album,{ foreignKey: 'artist_id'});
    

    生成:

    CREATE TABLE IF NOT EXISTS `Albums` (`id` INTEGER NOT NULL auto_increment, `artist_id` INTEGER, PRIMARY KEY (`id`)) ENGINE=InnoDB;
    

    【讨论】:

    • 我遇到了类似的问题,我只是想知道如何让关系反向工作。我找了一位艺术家并在上面调用 getAlbums,效果很好。但是,当我使用结果中的一个专辑项目并对其执行getArtists 时,它只返回null。那怎么解决?因为方法getArtist是sequelize提供的。
    • 在搜索文档一小时试图弄清楚如何做到这一点后,您的代码帮了大忙!现在有一个很好的双向 1:m 关联。耶!
    • 是否可以同时添加两个关系?或者这会导致任何冲突吗?
    • 不应该是这样的;注意 foreignKey 的值是 artist_id(相对于 album_id):Album.belongsTo(Artist, {foreignKey: 'artist_id'}); 就像 Sequelize 文档中的 City.belongsTo(Country, {foreignKey: 'countryCode' })。换句话说,belongsTo 函数是... 1) 调用 on 模型/表,它添加了一个 reference 列(即源;专辑或城市) 2) 调用 with 具有 referenced ID(艺术家或国家/地区)的模型/表 3) 使用 foreignKey 调用,列的名称指向 # 1 到 #2(艺术家 ID、国家代码)
    • 两个语句不应该都有 foreignKey: 'artist_id' 吗?因为 1 位艺术家有很多专辑,而 FK 的想法是相同的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多