簡體   English   中英

Sequelize 可以在查找查詢中使用 getter 或 setter 之類的東西嗎?

[英]Can Sequelize use something like a getter or setter in a find query?

對於我的 email 字段,我將電子郵件存儲和查詢為小寫字符串,以避免重復電子郵件,例如user@example.comUser@example.com 我在 model 中定義了一個 set 方法,例如:

const User = sequelize.define('user', {
  email: {
    type: DataTypes.STRING,
    unique: { msg: 'That email is already registered.' },
    validate: { isEmail: { msg: 'Invalid email.' } },
    set(value) {
      this.setDataValue('email', value.toLowerCase().trim())
    }
  }
})

這可以防止使用大寫字母設置電子郵件,但不會防止使用大寫字母進行查詢。 為了避免查詢,我必須記住在任何地方都使用.toLowerCase() 如果我可以在 model 上定義它會更好,這樣這樣的查詢就可以工作:

const user = await User.findOne({ where: { email: 'SomeEmail@example.com' } })

您可以使用模型中的hooks以小寫形式存儲 email。 請看下面的例子

const createUserModel = (sequelize, { STRING, UUIDV4, UUID, DATE }) => {
  const User = sequelize.define(
    'User',
    {
      userId: {
        type: UUID,
        defaultValue: UUIDV4,
        primaryKey: true,
      },
      email: {
        type: STRING,
        allowNull: false,
        unique: true,
        validate: {
          isEmail: true,
        },
      },
      password: {
        type: STRING,
        allowNull: true,
      },
    },
    {
      freezeTableName: true,
      timestamps: false,
      hooks: {
        beforeCreate: async instance => {
          const email = instance.get('email');
          instance.set('email', email.toLowerCase());
        },
        beforeUpdate: async instance => {
          if (instance.changed('email')) {
            const email = instance.get('email');
            instance.set('email', email.toLowerCase());
          }
        },
      },
    },
  );

  return User;
};

module.exports = {
  createUserModel,
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM