📜  laravel 验证存在多个表 laravel - TypeScript (1)

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

Laravel 验证存在多个表

在开发 Web 应用时,经常需要验证用户输入的数据是否存在于数据库中。如果你使用的是 Laravel 框架,Laravel 提供了很多验证规则来方便的进行数据验证。其中就包括了验证某个字段的值是否存在于指定的表中。

然而,有时我们需要验证某个字段的值是否存在于多个表中,这时该怎么做呢?

解决方案

有一种解决方案是使用自定义验证规则。我们可以在自定义验证规则中编写代码来判断某个字段的值是否存在于多个表中。

首先,我们需要创建一个自定义验证规则。在 Laravel 中,我们可以通过 php artisan make:rule 命令来创建自定义验证规则。比如:

php artisan make:rule ValueExistsInTables

这个命令会在 app/Rules 目录下生成一个名为 ValueExistsInTables.php 的文件。我们需要在这个文件中编写验证逻辑。

下面是一个简单的示例:

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class ValueExistsInTables implements Rule
{
    protected $tables;

    public function __construct($tables)
    {
        $this->tables = $tables;
    }

    public function passes($attribute, $value)
    {
        foreach ($tables as $table) {
            if (\DB::table($table)->where($attribute, $value)->exists()) {
                return true;
            }
        }
        
        return false;
    }

    public function message()
    {
        return 'The :attribute must exist in at least one of the specified tables.';
    }
}

在这个示例中,我们传入了一个由表名组成的数组 $tables。在 passes() 方法中,我们使用了 Laravel 查询构建器来判断某个字段的值是否存在于指定的表中。如果存在,则返回 true;否则返回 false

最后,在 message() 方法中我们返回了一个默认的错误信息。

现在,我们可以在某个表单验证器中使用我们的自定义验证规则了。比如:

use App\Rules\ValueExistsInTables;

Validator::make($data, [
    'email' => [
        'required',
        'email',
        new ValueExistsInTables(['users', 'admins'])
    ],
]);

在这个示例中,我们在对 email 字段进行验证时使用了我们自定义的 ValueExistsInTables 规则。我们传入了一个数组,包含了两个表名 usersadmins。当用户输入的 email 值存在于其中任何一个表中时,验证通过;否则验证失败。

结论

在 Laravel 中验证某个字段的值是否存在于多个表中,并没有一个内置的验证规则。但是我们可以通过自定义验证规则来解决这个问题。这里提供的解决方案只是其中的一种,你可以根据具体的需求来编写自己的验证规则。