Sequelize-關聯查詢上


在關聯查詢當中分別有一對一,一對多,多對多等關系,首先,先來看一對一的,創建一個 User 表,存儲的就是用戶信息,然后在創建一個 Book 表,存儲的就是用戶擁有的書,它們之間的關系是一對一的,一個用戶只能有一本書:

// 1.導入Sequelize
const Sequelize = require('sequelize');

(async () => {
    // 2.配置連接信息
    const sequelize = new Sequelize('demo', 'root', 'yangbuyiya', {
        // MySQL服務器地址
        host: 'www.yangbuyi.top',
        // MySQL服務器端口號
        port: 3310,
        // 注意點: Sequelize不僅僅能操作MySQL還能夠操作其它類型的數據庫
        // 告訴Sequelize當前要操作的數據庫類型
        dialect: 'mysql',
        // 連接池
        pool: {
            // 最多有多少個連接
            max: 5,
            // 最少有多少個連接
            min: 0,
            // 當前連接多久沒有操作就斷開
            idle: 10000,
            // 多久沒有獲取到連接就斷開
            acquire: 30000,
        }
    });

    // 3.創建模型
    const User = sequelize.define('user', {
        id: {
            type: Sequelize.INTEGER,
            primaryKey: true,
            autoIncrement: true
        },
        name: {
            type: Sequelize.STRING,
            allowNull: false,
            unique: true
        },
        age: {
            type: Sequelize.TINYINT,
            defaultValue: 66
        },
        gender: {
            type: Sequelize.ENUM(['男', '女', '妖']),
            defaultValue: '妖'
        }
    }, {
        // 告訴 sequelize 不需要自動將表名變成復數
        freezeTableName: true,

        // 不需要自動創建 createAt / updateAt 這兩個字段
        timestamps: false,
    });

    const Book = sequelize.define('book', {
        id: {
            type: Sequelize.INTEGER,
            primaryKey: true,
            autoIncrement: true
        },
        name: {
            type: Sequelize.STRING,
            allowNull: false,
            unique: true
        },
        price: {
            type: Sequelize.DOUBLE,
            defaultValue: 66
        },
        uId: {
            type: Sequelize.INTEGER,
            allowNull: false
        }
    }, {
        // 告訴 sequelize 不需要自動將表名變成復數
        freezeTableName: true,

        // 不需要自動創建 createAt / updateAt 這兩個字段
        timestamps: false,
    });

    sequelize.sync();
})();

創建對應的表了之后然后在插入對應的用戶書籍數據:

image-20220123120146768

INSERT INTO `book` VALUES (1, '玩轉Vue', 999, 1);
INSERT INTO `book` VALUES (2, '玩轉React', 66, 4);
INSERT INTO `book` VALUES (3, '玩轉Golang', 8888, 5);

建立查詢關系

官方文檔:https://sequelize.org/v5/class/lib/associations/has-one.js~HasOne.html

image-20220123121944342

image-20220123121831492

// hasOne 誰擁有一個誰 / 一個人擁有一本書
User.hasOne(Book, {
    foreignKey: 'uId',
    sourceKey: 'id'
});
// belongsTo 誰屬於一個誰 / 一本書屬於一個人
Book.belongsTo(User, {
    foreignKey: 'uId',
    sourceKey: 'id'
});

關聯查詢

只要建立了表與表之間的關系, 那么在查詢人的時候, 就可以把這個人擁有的那本書也查詢出來了:

let user = await User.findOne({
   where: {
       id: 1
   },
    include: {
       model: Book
    }
});

console.log(user);
console.log(user.book.dataValues);

image-20220123122640484

如上是查詢 User,如果我們在查詢 Book 時,只要建立了表與表之間的關系, 那么在查詢書的時候, 就可以把這本書屬於哪一個人也查詢出來了:

let book = await Book.findOne({
    where: {
        id: 1
    },
    include: {
        model: User
    }
});

console.log(book);
console.log(book.user.dataValues);

注意點

  • 只要建立了人和書的關系, 那么在查詢人的時候, 就可以把擁有的那本書也查詢出來(上方已經介紹)
  • 只要建立了書和人的關系, 那么在查詢書的時候, 就可以把書屬於哪個人也查詢出來(上方已經介紹)

如果沒有建立相關的關系, 那么就不能查詢出相關的內容,假如我現在將書屬於某一個人的關系去除了,那么在查詢書的時候所對應的屬於那個人就不會被查詢出來如下:

image-20220123123140446

將 User 與 Book 關系去除了查詢也是同理,如上是直接報錯了,這就是表示查詢不了所對應的人。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM