【问题标题】:Sequelize query on model where hasMany count is empty对 hasMany 计数为空的模型进行 Sequelize 查询
【发布时间】:2016-04-10 23:11:46
【问题描述】:

我有一个 Product 模型,它通过 hasMany 关系链接到一个 medias 表:

Product.hasMany(models.Media, {
    foreignKey: 'mediableId',
    constraints: false,
    scope: {
        mediable: 'product'
    },
    as: 'medias'
});

我正在寻找一种方法来查询所有具有零媒体的产品,如何使用 Sequelize 来完成?没有原始查询甚至可能吗?

【问题讨论】:

    标签: node.js postgresql sequelize.js


    【解决方案1】:

    您可以对 where 子句使用原始查询。

    例如,假设您的Product 模型定义如下:

    module.exports = (sequelize, DataTypes) => sequelize.define('products', {
        id: {
            type: DataTypes.INTEGER,
            allowNull: false,
            primaryKey: true,
            autoIncrement: true
        },
        name: {
            type: DataTypes.STRING,
            allowNull: true
        }
    }, {
        tableName: 'products',
        freezeTableName: true,
        underscored: true,
        classMethods: {
            associate: models => {
                models.products.hasMany(models.medias, {
                    foreignKey: 'mediable_id',
                    constraints: false,
                    scope: {
                        mediable: 'product'
                    }
                });
            }
        }
    });
    

    您的Media 模型定义为:

    module.exports = (sequelize, DataTypes) => sequelize.define('medias', {
        id: {
            type: DataTypes.INTEGER,
            allowNull: false,
            primaryKey: true,
            autoIncrement: true
        },
        name: {
            type: DataTypes.STRING,
            allowNull: true
        },
        mediable: {
            type: DataTypes.STRING,
            allowNull: true
        },
        mediable_id: {
            type: DataTypes.INTEGER,
            allowNull: true
        }
    }, {
        tableName: 'medias',
        freezeTableName: true,
        underscored: true,
        classMethods: {
            associate: models => {
                models.products.belongsTo(models.products, {
                    foreignKey: 'id',
                    constraints: false
                });
            }
        }
    });
    

    那么你可以这样查询它:

    sequelize.sync().then(() => Promise.all([
    
        // Prepopulate Data
        models.products.upsert({
            id: 1,
            name: 'Product A'
        }),
        models.products.upsert({
            id: 2,
            name: 'Product B'
        }),
        models.products.upsert({
            id: 3,
            name: 'Product C'
        }),
    
        models.medias.upsert({
            id: 1,
            name: 'Media A',
            mediable: 'item',
            mediable_id: 1
        }),
        models.medias.upsert({
            id: 2,
            name: 'Media B',
            mediable: 'product',
            mediable_id: 1
        }),
        models.medias.upsert({
            id: 3,
            name: 'Media C',
            mediable: 'product',
            mediable_id: 1
        }),
        models.medias.upsert({
            id: 4,
            name: 'Media D',
            mediable: 'product',
            mediable_id: 2
        }),
        models.medias.upsert({
            id: 5,
            name: 'Media E'
        })
    
    ])).then(() => models.products.findAll({
        where: ["medias.mediable_id IS NULL OR medias.mediable != 'product'"],
        include: [{
            model: models.medias,
            required: false,
        }]
    })).then(products => {
        // The rest of your logic here...
    });
    

    【讨论】:

      猜你喜欢
      • 2019-02-28
      • 2019-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 2022-01-19
      相关资源
      最近更新 更多