对hasMany计数为空的模型进行查询查询

时间:2016-03-31 20:17:11

标签: node.js postgresql sequelize.js

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

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

我正在寻找一种查询所有零介质产品的方法,怎么能用Sequelize来完成?如果没有原始查询,它甚至可能吗?

1 个答案:

答案 0 :(得分: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...
});
相关问题