Sequelize 定义 n:m 关系(import 方式),以及其使用


1. 定义

附上3张表的结构

albums 专题表

CREATE TABLE `albums` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(255) NOT NULL,
 `views` int(11) DEFAULT '0',
 `sort` int(11) DEFAULT '999999999',
 `status` varchar(255) DEFAULT 'off',
 `created_at` datetime NOT NULL,
 `updated_at` datetime NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8

products 产品表

CREATE TABLE `products` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(255) NOT NULL,
 `imgs` text NOT NULL,
 `before_price` double(12,2) NOT NULL,
 `after_price` double(12,2) DEFAULT NULL,
 `link` varchar(255) NOT NULL,
 `views` int(11) DEFAULT '0',
 `sort` int(11) DEFAULT '999999999',
 `status` varchar(255) DEFAULT 'off',
 `created_at` datetime NOT NULL,
 `updated_at` datetime NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8

album_product_mapping, mapping 表

CREATE TABLE `album_product_mappings` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `album_id` int(11) NOT NULL,
 `product_id` int(11) NOT NULL,
 `sort` int(11) NOT NULL DEFAULT '999999999',
 `created_at` datetime NOT NULL,
 `updated_at` datetime NOT NULL,
 PRIMARY KEY (`id`),
 KEY `album_id` (`album_id`),
 KEY `product_id` (`product_id`),
 CONSTRAINT `album_product_mappings_ibfk_1` FOREIGN KEY (`album_id`) REFERENCES `albums` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `album_product_mappings_ibfk_2` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8

album 与 product 的关系为 n:m

在 sequelize 内定义 models

Album

'use strict';

module.exports = function (sequelize, DataTypes) {
    var Album = sequelize.define('Album', {
        name: DataTypes.STRING,
        views: DataTypes.INTEGER,
        sort: DataTypes.INTEGER,
        status: DataTypes.STRING
    }, {
        underscored: true,
        tableName: "albums",
        classMethods: {
            associate: function (models) {
                Album.belongsToMany(models.Product, {
                    through: {
                        model: models.Album_product_mapping,
                        unique: false,
                    },
                    foreignKey: "album_id",
                    constraints: false,
                    as: "products"
                });
            }
        }
    });

    return Album;
};

Product

'use strict';
module.exports = function (sequelize, DataTypes) {
    var Product = sequelize.define('Product', {
        name: DataTypes.STRING,
        imgs: DataTypes.TEXT,
        before_price: DataTypes.DOUBLE,
        after_price: DataTypes.DOUBLE,
        link: DataTypes.STRING,
        views: DataTypes.INTEGER,
        sort: DataTypes.INTEGER,
        status: DataTypes.STRING
    }, {
        underscored: true,
        tableName: "products",
        classMethods: {
            associate: function (models) {
                // associations can be defined here
                Product.belongsToMany(models.Album, {
                    through: {
                        model: models.Album_product_mapping,
                        unique: false
                    },
                    foreignKey: "product_id",
                    constraints: false
                })
            }
        }
    });

    return Product;
};

Album_product_mapping

'use strict';
module.exports = function (sequelize, DataTypes) {
    var Album_product_mapping = sequelize.define('Album_product_mapping', {
        album_id: DataTypes.INTEGER,
        product_id: DataTypes.INTEGER,
        sort: DataTypes.INTEGER,
    }, {
        underscored: true,
        tableName: "album_product_mappings",
        classMethods: {
           associate: function (models) {
                // associations can be defined here
            }
        }
    });
    return Album_product_mapping;
};

关联关系的定义位于 classMethods 中。

2 使用

还是以上述的例子,

获取:

let product = models.Product.findOne({where: {id: productId}});

// 获取对应绑定的 albums
// product 为实例 
product.getAlbums();

更新 n:m 关系

let newAlbums = yield models.Album.findAll({where: {id: {$in: new_albums_id_arr}}});

// newAlbums 为实例数组
// 直接使用 [{album_id: 1, product_id:22}, {album_id: 2, product_id: 22}] 这种形式的话更新不了关联关系。

product.setAlbums(newAlbums);

其余用法http://docs.sequelizejs.com/manual/tutorial/associations.html#creating-with-associations

优质内容筛选与推荐>>
1、Shell编程之函数
2、automation服务器不能创建对象
3、使用java开发窗体应用程序用什么软件开发比较好?
4、自动化测试-数据驱动实践(新增2)
5、Python 访问字典(dictionary)中元素


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn