sequelize中的hooks 及association使用及爬坑

nodejs的orm模块sequelize功能很强大也很深奥,记录下今天使用hooks 及 association遇到了几个坑。
hooks:顾名思义就是钩子,简单的理解为可以定义相关动作后的关联动作
association: 关联,显式的指定该模型的关联关系。个人觉得 ORM 最大的问题就是关联查询及其复杂,反人类简直。有了 association 就可以显式的指定关联,方便查询。

  1. 定义modle

    在定义modle的时候还比较容易,只需要在正常的定义后面加上 hooks 和 association 部分,举个例子

const T= app.model.define(
        't', 
        {
            id: { type: STRING(64), primaryKey: true, allowNull: false },
            created_at: {
                type: DATE,
                get() {
                    return moment(this.getDataValue('created_at')).format('YYYY-MM-DD HH:mm:ss');
                }
            },
            updated_at: {
                type: DATE,
                get() {
                    return moment(this.getDataValue('updated_at')).format('YYYY-MM-DD HH:mm:ss');
                }
            },
            deleted_at: { type: DATE },
            deleted: { type: BOOLEAN, allowNull: false, defaultValue: false },
            created_by: { type: STRING(64), allowNull: false },
            updated_by: { type: STRING(64), allowNull: false },
            name: { type: STRING(64), allowNull: false },
            company_id: { type: STRING(64), allowNull: false }
        },
        {
            timestamps: true,
            paranoid: true,
            createdAt: 'created_at',
            updatedAt: 'updated_at',
            deletedAt: 'deleted_at',
            hooks: {
                afterDestroy: function(t, options) {
                    t.update( { deleted: true }, options);
                    return null;
                }
            }
        }
    );
    
        T.associate = function() {
        app.model.T.belongsTo(app.model.Company, { as: 'company', foreignKey: 'company_id', targetKey: 'id' });
    }
  1. 查询modle
let query = {
            attributes: {
                include: [
                    [Sequelize.col('company.name'), 'company_name']
                ],
                exclude: [
                    'deleted_at',
                    'deleted',
                    'created_by',
                    'updated_by'
                ]
            },
            include: [                
                {
                    model: model.Company,
                    required: false,
                    as: 'company',
                    attributes: []
                }
            ],
            where: {
                name: { [Op.substring]: name.trim() }
            },
            order: [
                ['updated_at', 'DESC'],
                ['name', 'ASC']
            ],
            limit: parseInt(limit) || 10,
            offset: parseInt(offset) || 0
        };
        let index = await model.T.findAndCountAll(query);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值