【问题标题】:Sequelize 'where' on parent and child when parent hasMany childs当父母有许多孩子时,对父母和孩子的“位置”进行续集
【发布时间】:2021-10-17 14:31:52
【问题描述】:

我有 2 个模型:

class User extends Model {
    static associate(models) {
      User.hasMany(models.Role, {
        foreignKey: 'userId'
      });
    }
  };
  User.init({
    firstname: {
      type: DataTypes.STRING,
    },
    lastname: {
      type: DataTypes.STRING,
    },
    allowedApps: {
      type: DataTypes.ENUM({
        values: Object.keys(PORTALS)
      }),
      allowNull: false
    }
  }, {
    sequelize,
    paranoid: true,
    modelName: 'User',
  });

class Role extends Model {
    static associate(models) {
      Role.BelongsTo(models.User, {
        foreignKey: 'userId'
      });
    }
  };
  Role.init({
    type: {
      type: DataTypes.STRING,
      unique: true
    },
    name: DataTypes.STRING,
    userId: {
      type: DataTypes.INTEGER,
      allowNull: false,
    }
  }, {
    sequelize,
    paranoid: true,
    modelName: 'Role',
  });

我想获取名字或角色类型与特定条件匹配的所有用户。比如:

User
    .findAndCountAll({
        where: {
            $or: [
         {
            firstname: "John Doe"
         },
         {
            "$Role.type$": "Admin"
         }
       ]
        },
        include: [{
            model: Role,
        }],
    }).limit=10,offset=0
    .then(users => res.status(200).send(users))
    .catch(error => {
        return res.sendStatus(500);
    });

上面的查询给了我错误:“SequelizeDatabaseError: Unknown column 'Role.type' in 'field list'”

当子模型具有一对多关系且我的限制和偏移完整时,我想搜索子模型。如果用户与角色有 HasOne 关系,相同的查询会给我成功。 这只是我尝试实现的示例代码,因此请忽略任何拼写错误和愚蠢的错误。

【问题讨论】:

    标签: mysql node.js sequelize.js


    【解决方案1】:

    经过一番挖掘:

    await User.findAll({
    where: {
                $or: [
             {
                firstname: "John Doe"
             },
             {
                "$Role.type$": "Admin"
             }
           ]
            },
      include: {
        model: Role,
        as: 'Role',
        required: false
      }
    });
    

    但是,选择没有关联角色 (required: false) 的用户,同时使用角色上存在的属性($ 或:$Role.type$)查询此类用户,这在逻辑上没有意义。如果我们设置Required = true,那么我们就违反了你的初始条件

    名字或角色类型符合特定条件。

    以下解决了这个问题:

    await User.findAll({
      include: {
        model: Role,
        required: false
      }
    })
    .then(
      users => users
        .filter(user => user?.firstName === "John Doe" || user.role?.type === 
        "Admin");
    );
    

    【讨论】:

    • 字段 'type' 属于子模型...所以仍然无法访问它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多