eastree/uniquewith-validator

针对组合唯一索引的 Laravel 自定义验证器

3.1.3 2018-04-26 09:59 UTC

README

Build Status Scrutinizer Code Quality

此包包含 Laravel 的 validateUnique 规则的变体,允许验证多列 UNIQUE 索引。

旧版本文档

安装

通过 Composer 安装此包。在命令行

composer require felixkiss/uniquewith-validator

配置

将以下内容添加到你的 providers 数组中的 config/app.php

'providers' => [
    // ...

    Felixkiss\UniqueWithValidator\ServiceProvider::class,
],

使用

像使用任何 Validator 规则一样使用它

$rules = [
    '<field1>' => 'unique_with:<table>,<field2>[,<field3>,...,<ignore_rowid>]',
];

参见 Laravel 的验证文档

指定数据库中的不同列名

如果你的输入字段名与数据库中的相应列名不同,你可以明确指定列名。

例如,你的输入包含一个名为 'last_name' 的字段,但数据库中的列名是 'sur_name'

$rules = [
    'first_name' => 'unique_with:users, middle_name, last_name = sur_name',
];

示例

假设你在数据库中有一个 users 表和类似的 User 模型

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;

class CreateUsersTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function(Blueprint $table) {
            $table->increments('id');

            $table->timestamps();

            $table->string('first_name');
            $table->string('last_name');

            $table->unique(['first_name', 'last_name']);
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('users');
    }

}
<?php

class User extends Eloquent { }

现在你可以使用以下方式验证给定的 first_namelast_name 组合

Route::post('test', function() {
    $rules = [
        'first_name' => 'required|unique_with:users,last_name',
        'last_name' => 'required',
    ];

    $validator = Validator::make(Input::all(), $rules);

    if($validator->fails()) {
        return Redirect::back()->withErrors($validator);
    }

    $user = new User;
    $user->first_name = Input::get('first_name');
    $user->last_name = Input::get('last_name');
    $user->save();

    return Redirect::home()->with('success', 'User created!');
});

你也可以指定一个要忽略的行 ID(用于解决更新时的唯一约束)

这将忽略 ID 为 2 的行

$rules = [
    'first_name' => 'required|unique_with:users,last_name,2',
    'last_name' => 'required',
];

要指定 ID 的自定义列名,传递它如下

$rules = [
    'first_name' => 'required|unique_with:users,last_name,2 = custom_id_column',
    'last_name' => 'required',
];

如果你的 ID 不是数字,你可以告诉验证器

$rules = [
    'first_name' => 'required|unique_with:users,last_name,ignore:abc123',
    'last_name' => 'required',
];

你还可以设置额外的子句。例如,如果你的模型使用软删除,则可以使用以下代码选择所有已存在但标记为已删除的行

$rules = [
    'first_name' => 'required|unique_with:users,last_name,deleted_at,2 = custom_id_column',
    'last_name' => 'required',
];

许可

MIT