首页 » Web技术 » Laravel » 正文

Laravel unique 和 exists 规则改善

laravel-validation-rule

使用 Laravel 的 ValidatesRequests trait 验证请求是非常简单的,该 trait 已经通过 BaseController 被自动包含进来。它的功能非常强大,并为常用的情况提供了多个有用的规则。其中 exists()unique() 用于验证数据是否在数据库中存在,通常使用方式如下:

// exists 例子
'email' => 'exists:staff,account_id,1'
// unique 例子
'email' => 'unique:users,email_address,$user->id,id,account_id,1'

你可以看到,这种方式不便于记忆,有时候你可能经常需要去查看文档。

从 Laravel v5.3.18 开始,这两个规则都通过新引入的 Rule 类被简化了。

使用上面相同的例子,通过下面这个更流畅的例子可以达到相同的效果:

'email' => [
    'required',
    Rule::exists('staff')->where(function ($query) {
        $query->where('account_id', 1);
    }),
],
'email' => [
    'required',
    Rule::unique('users')->ignore($user->id)->where(function ($query) {
        $query->where('account_id', 1);
    })
],

这两个方法都支持下面的方法:

  • where
  • whereNot
  • whereNull
  • whereNotNull

unique 方法包含额外的 ignore 方法,所以你可以验证其他的数据。

这个新特性的另一个福利是旧的方式依然完全支持,实现方式是通过 formatWheres 方法转换为旧的字符串方式:

protected function formatWheres()
{
    return collect($this->wheres)->map(function ($where) {
        return $where['column'].','.$where['value'];
    })->implode(',');
}

要获取最新版本你需要运行 composer update,一旦获取到 v5.3.18 你就可以使用这种全新的流畅的方式了。

Update On 2016-10-16:

demisions 规则也将在 Laravel v5.3.19 中加入新的方式:

laravel-rule-dimensions

via: laravel-news

发表评论