忽略 AdonisJs 中唯一验证规则中的多个字段

Ignore multiple fields in unique validation rule in AdonisJs

我正在尝试更新我的用户并在电子邮件上应用唯一验证器以防止重复。

我需要忽略提供的 user_id 的电子邮件唯一性,以及那些标记为 is_deleted 到 1 的记录。

只有第一个语句有效,如果我将 is_deleted,1 放在 id,${data.user_id} 之前它适用于删除。但不适用于 user_id。

get rules() {
const data = this.ctx.request.post()
console.log('current context: ', data.user_id)
return {
  // email: `required|email|unique:users,email,id,${data.user_id},is_deleted,1`,
  email: `required|email|unique:users,email,id,${data.user_id}|unique:users,email,is_deleted,1`,
  phone_number: 'required|max:10',
  status_id: 'required'
  }
}

但是,只有第一个忽略语句有效,第二个无效

我会推荐 extending the validation framework and add a custom rule(一个好的名字是 unique_email)。你会发现它更有生产力和可测试性。代码类似于:

const uniqueEmailFn = async (data, field, message, args, get) => {
  const email = get(data, 'email')
  const userId = get(data, 'user_id')
  if (!email) {
    /**
     * skip validation if value is not defined. `required` rule
     * should take care of it.
    */
    return
  }

  const [table, column] = args
  const row = await Database.table('users')
    .where('id', userId)
    .where('email', email)
    .where('is_deleted', false)
    .first()

  if (row) {
    throw 'The inputted e-mail is already taken'
  }
}

一般来说,简单和通用的验证最好使用默认规则,业务特定的规则可以通过扩展框架来添加。