📜  laravel 验证表中存在 id - TypeScript (1)

📅  最后修改于: 2023-12-03 15:17:17.232000             🧑  作者: Mango

Laravel 验证表中存在 id - TypeScript

Laravel 提供了一种方便的方法来验证一个给定字段在数据库表中是否存在。这在多个场景下非常有用,例如,当你想确保用户输入的数据不会违反数据库表之间的外键关系时。

对于 TypeScript 开发者来说,这个过程也相对简单。我们只需定义一个自定义验证规则,并将其传递给 Laravel 验证器。

下面是一个例子。

步骤
  1. 首先,我们需要在 app/Rules 文件夹中创建一个新的 TypeScript 类,这个类将作为我们自定义验证规则的定义。
// app/Rules/ExistsInDatabase.ts

import { validate } from 'class-validator';
import { getConnection } from 'typeorm';

import { ValidationArguments, ValidatorConstraint, ValidatorConstraintInterface } from 'class-validator/types/validation/ValidatorConstraintInterface';

@ValidatorConstraint({ async: true })
export class ExistsInDatabase implements ValidatorConstraintInterface {

  public async validate(value: any, args: ValidationArguments): Promise<boolean> {
    const [ entity ] = args.constraints;
    const repository = getConnection().getRepository(entity);
    const result = await repository.findOne({ where: { id: value } });
    return !!result;
  }

  public defaultMessage(args: ValidationArguments): string {
    return `${args.property} does not exist in database.`;
  }

}
  1. 接下来,在你定义验证器时,我们只需要将 ExistsInDatabase 规则作为其中一个规则添加到规则列表中即可。
// app/Http/Controllers/SomeController.ts

import { validate } from 'class-validator';
import { Request, Response } from "express";
import { plainToClass } from 'class-transformer';
import { ExistsInDatabase } from '../../Rules/ExistsInDatabase';

export class SomeController {

  public async someMethod(req: Request, res: Response): Promise<void> {
    const { entity_id } = req.body;

    const validationOptions = { validationError: { target: false } };
    const validationErrors = await validate(plainToClass(SomeRequestClass, req.body), validationOptions);
    
    if (validationErrors.length > 0) {
      return res.status(400).send(validationErrors.map((error) => error.constraints));
    }

    // 执行插入逻辑
  }

}

现在,你就完成了一个自定义的 Laravel 验证规则,以确保输入的值存在于数据库表中。

总结

这是一个相对简单的任务,它可以帮助确保你的应用程序中数据的完整性。通过使用 Laravel 的自定义验证规则,你可以更加方便地完成这项任务,而无需重复编写重复的代码。