📅  最后修改于: 2023-12-03 15:17:17.232000             🧑  作者: Mango
Laravel 提供了一种方便的方法来验证一个给定字段在数据库表中是否存在。这在多个场景下非常有用,例如,当你想确保用户输入的数据不会违反数据库表之间的外键关系时。
对于 TypeScript 开发者来说,这个过程也相对简单。我们只需定义一个自定义验证规则,并将其传递给 Laravel 验证器。
下面是一个例子。
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.`;
}
}
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 的自定义验证规则,你可以更加方便地完成这项任务,而无需重复编写重复的代码。