如何在Sequelize中实现JOIN

时间:2018-05-28 09:46:13

标签: postgresql sequelize.js

我有三个表,结构描述如下:

用户表包含字段:idnamedate_created

图书馆表包含字段:idcapacitydate_createduser_id

user_id是User表的外键,Library的每个实例都必须属于用户。

最后一个表是Books表,其中包含以下字段:idstatusdate_createdlibrary_id

library_id是Library表的外键,书的每个实例都必须属于Library。

我想要实现的是一种查询数据库以查找属于用户的图书的所有实例并且状态为例如:borrowed

的方法

2 个答案:

答案 0 :(得分:0)

我认为您需要include,请查看以下查询:

Books.findAll({
    include : { //<------ By this you can use association
        model : User ,
        where : { id : YOUR_USER_ID }
    },
    where : { status : 'borrowed' }    
}).then(books => {
    if(books.length > 0) {
        console.log(books);
    } else {
        console.log("No books found");
    }
})

答案 1 :(得分:0)

首先要实现连接,需要在sequelize模型之间建立关联。 所以,在你的情况下

models.Library.hasMany(models.Books, {
    foreignKey: 'library_id'
})

models.Books.belongsTo(models.Library, {
    foreignKey: 'library_id'
})

models.Library.belongsTo(models.User, {
    foreignKey: 'user_id'
})

models.Books.hasMany(models.Library, {
    foreignKey: 'user_id'
})

此处models 是一个续集实例。 你可以在这里找到更多关于sequelize associaitions的信息http://docs.sequelizejs.com/manual/tutorial/associations.html

   Now, To find all instances of Books that belongs to User

    models.User.findAll({
        include: [{
            model: models.Library,
            required: true, // do an INNER Join 
            include: [{
                model: models.Books,
                required: true,
                where: {
                    status: 'borrowed'
                }
            }] t
        }],
        where: {
            user_id: 'some_user_id'
        }
    })