rinvex / tmp-felixkiss-uniquewith-validator
用于组合唯一索引的 Laravel 自定义验证器
Requires
- php: ^7.4.0 || ^8.0.0
- illuminate/support: ^5.5|^6.0|^7.0|^8.0
- illuminate/validation: ^5.5|^6.0|^7.0|^8.0
Requires (Dev)
- bossa/phpspec2-expect: ^3.0
- phpspec/phpspec: ^5.0|^6.0
README
临时将包名改为 "rinvex/tmp-felixkiss-uniquewith-validator",以便在 Packagist 上发布。这是作者发布新版本前的临时分支,完全支持 Laravel v8+
Laravel 的 unique_with 验证器规则
此包包含 Laravel 的 validateUnique
规则的一个变体,允许对多列 UNIQUE 索引进行验证。
旧版本文档
安装
通过 Composer 安装包。在命令行中
composer require felixkiss/uniquewith-validator
配置
在 config/app.php
中的 providers
数组中添加以下内容
'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', ];
忽略现有行(更新时很有用)
您还可以指定一个要忽略的行 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', ];
软删除注意事项
在 Laravel 5(在 5.5 上测试过),如果在表单请求类中执行验证,则跳过字段 deleted_at,因为它未在请求中发送。为了解决这个问题,请将 'deleted_at' => null 添加到请求类中的验证参数,例如。
protected function validationData() { return array_merge($this->request->all(), [ 'deleted_at' => null ]); }
指定要使用的特定数据库连接
如果我们有一个名为 some-database
的连接,我们可以强制使用此连接(而不是默认连接)如下所示
$rules = [ 'first_name' => 'unique_with:some-database.users, middle_name, last_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_name
和last_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!'); });
许可
MIT