zoukankan      html  css  js  c++  java
  • Eggjs 联表查询

    实现:

    通过 user表 关联外键 查询 role表 及 diary表

    1.数据模型

    app/model/user.js

    /**
     * 用户模型
     */
    module.exports = app => {
      const { STRING, INTEGER } = app.Sequelize;
      const User = app.model.define('user', {
        id: {
          type: INTEGER,
          autoIncrement: true,
          primaryKey: true
        },
        name: {
          type: STRING,
          allowNull: false
        },
        email: {
          type: STRING,
          allowNull: false
        },
        password: {
          type: STRING(32),
          allowNull: false
        },
        avatar: {
          type: STRING,
          allowNull: true
        },
        roleId: {
          type: INTEGER,
          allowNull: false,
          defaultValue: 6
        }
      });
    
      // 表关联的字段
      User.associate = function() {
        // 一对多
        app.model.User.hasMany(app.model.Diary, { foreignKey: 'user_id', targetKey: 'id'});
        /**
         * User.belongsTo(关联的模型, { foreignKey: '使用什么字段关联', targetKey: '与关联的模型那个字段关联', as: '别名' });
        */
        // 一对一
        app.model.User.belongsTo(app.model.Role, { foreignKey: 'roleId', targetKey: 'id', as: 'role'});
      }
    
      return User;
    }

    app/model/role.js

    /**
     * 角色模型
     */
    module.exports = app => {
      const { INTEGER, STRING } = app.Sequelize;
      const Role = app.model.define('role', {
        id: {
          type: INTEGER,
          primaryKey: true,
          autoIncrement: true
        },
        name: STRING(50),
        pid: INTEGER
      }, {
        timestamps: false
      });
     
      return Role;
    }

    app/model/diary.js

    /**
     * 日志模型
     */
    module.exports = app => {
      const { STRING, INTEGER } = app.Sequelize;
      const Diary = app.model.define('diary', {
        id: {
          type: INTEGER,
          autoIncrement: true,
          primaryKey: true
        },
        title: {
          type: STRING,
          allowNull: false
        },
        content: {
          type: STRING,
          allowNull: false
        }
      });
    
      // 表关联的字段
      Diary.associate = function() {
        app.model.Diary.belongsTo(app.model.User, { foreignKey: 'user_id', targetKey: 'id'})
      }
    
      return Diary;
    }
    

    2.关联查询

    app/service/user.js

    // 获取用户列表/详情
    async detail(id) {
      const { app } = this;
      try {
        if(id){
          // return await app.model.User.findByPk(app.toInt(id));
          return await app.model.User.findOne({
            attributes: ['id','name','email','avatar','roleId'],
            where: { id },
            include: [{
              model: app.model.Role,
              as: 'role',//这里的 as需要与之前定义的as名字相同
            }]
          });
        }
        return await app.model.User.findAll({
          attributes: ['id','name','email','avatar','roleId'],
          include: [{
            model: app.model.Role,
            as: 'role',//这里的 as需要与之前定义的as名字相同
          },{
            model: app.model.Diary
          }]
        });
      }catch(err){
        console.log(err);
        return null;
      }
    }
    

    .

  • 相关阅读:
    深入理解JavaScript中的this关键字
    使用yii的layout,加入<?php echo $content; ?>这句话时,它会自动在子页面上面添加一个div包裹
    使用 BEGINCONTENT() 和 ENDCONTENT() 设定 YII 的 LAYOUTS
    孙悟空的师傅是谁
    PHP MemCached高级缓存配置图文教程
    C++中的基类与派生类
    矩阵快速幂
    华为上机测试题
    2016网易研发题目
    冒泡排序
  • 原文地址:https://www.cnblogs.com/crazycode2/p/12519557.html
Copyright © 2011-2022 走看看