sails.js多对多关系中的额外字段连接表

时间:2015-04-19 19:06:19

标签: mysql sql node.js sails.js waterline

我有两种模式:

Order.js

module.exports = {
    attributes: {
        //Id is generated by mongo and is a primary key
        address: {
            type: 'string',
            required: true,
            size: 1000
        },
        status: {
            type: 'string',
            required: true,
            size: 15,
            defaultsTo: 'pending',
            enum: ['pending', 'processing', 'cancelled']
        },
        total: {
            type: 'string',
            required: true,
            size: 50
        },
        menues: {
            collection: 'menu',
            via: 'orders',
            dominant: true
        },
        customer: {
            model: 'customer'
        }
    }
};

Menu.js

module.exports = {
    attributes: {
        //Id is generated by mongo
        name: {
            type: 'string',
            required: true,
            size: 255
        },
        description: {
            type: 'string',
            required: true,
            size: 1000
        },
        price: {
            type: 'string',
            required: true,
            size: 15
        },
        picture: {
            type: 'string',
            size: 255
        },
        //Relations
        orders: {
            collection: 'order',
            via: 'menues'
        }
    }
};

它有一个多对多的关系,它可以完美地工作并创建一个 menu_orders__order_menues 集合,一切都很好。

但我需要按顺序为每个菜单保存数量。喜欢菜单ID“1”的数量是2等。

所以额外的数据是数量: 每个订单应该有一定数量的每个菜单

执行此操作的最佳方法是什么,以及如何将其存储在db中? 我想以某种方式将它存储在关系表中,但我并没怎么说。

请告诉我最正确且可接受的解决方案。

P.S。我目前使用 sails-mongo ,但很快就会迁移到 MySQL Postgres ,所以我需要以相对的方式完成此操作。

1 个答案:

答案 0 :(得分:2)

quantity字段添加到您的Menu模式架构中,并可以使用afterCreate函数为其设置值。

Order.js

module.exports = {
    attributes: {
        address: {
            type: 'string',
            required: true,
            size: 1000
        },
        status: {
            type: 'string',
            required: true,
            size: 15,
            defaultsTo: 'pending',
            enum: ['pending', 'processing', 'cancelled']
        },
        total: {
            type: 'string',
            required: true,
            size: 50
        },
        menues: {
            collection: 'menu',
            via: 'orders',
            dominant: true
        },
        customer: {
            model: 'customer'
        }
    },
    afterCreate: function (order, cb) {
        Menu.find(order.menues, function (err, menues) {
            if (err) return cb(err);
            async.each(menues, function (menu, next) {
                menu.quantity++;
                menu.save(next);
            }, cb);
        });
    }
};

Menu.js

module.exports = {
    attributes: {
        name: {
            type: 'string',
            required: true,
            size: 255
        },
        description: {
            type: 'string',
            required: true,
            size: 1000
        },
        price: {
            type: 'string',
            required: true,
            size: 15
        },
        picture: {
            type: 'string',
            size: 255
        },
        quantity: {
            type: 'number',
            defaultsTo: 0
        },
        orders: {
            collection: 'order',
            via: 'menues'
        }
    }
};

这不是一个完成的解决方案。您还必须处理afterUpdateafterDestroy函数。