[英]Can Sequelize use something like a getter or setter in a find query?
對於我的 email 字段,我將電子郵件存儲和查詢為小寫字符串,以避免重復電子郵件,例如user@example.com
和User@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.