node.js - 对 hasMany 计数为空的模型进行后续查询

标签 node.js postgresql sequelize.js

我有一个产品模型,它链接到具有 hasMany 关系的媒体表:

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

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

最佳答案

您可以对 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...
});

关于node.js - 对 hasMany 计数为空的模型进行后续查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36342929/

相关文章:

javascript - NodeJS 不喜欢通行证 + Sequelize 登录

javascript - 如何连接两个应用程序React/Node?

sql - 有什么办法可以在 postgreSQL 中将假期与工作日分开吗?

angularjs - npm 错误!在应用程序上运行 npm install 时出现代码 128

python - 在 Heroku 上开始使用 Python - 找不到 pg_config 可执行文件

sql - 如何编写 SQL 查询以将特定结果放在 PostgreSQL 中的每个第 n 个位置上

node.js - sequelize-cli 返回 'Unknown arguments' 错误

postgresql - Sequelize Postgres 查询 JSONB ARRAY

javascript - 如何使用 Nodemailer 使用我的公司域发送电子邮件?

javascript - 用 Node JS 导入 * 吗?