【问题标题】:Laravel unique only if input exists with the same group_ID仅当输入具有相同的 group_ID 时,Laravel 才是唯一的
【发布时间】:2017-10-25 17:13:03
【问题描述】:

我目前有一个帐户创建和登录页面。我的模型中的两个页面都有规则,对于我的注册,我的规则是这样的:

public static $rules = [
    'username' => 'unique:users,username',
    'group_id'=>'required',
    'password' => 'required'
]

所以当用户名已经存在时,这基本上会给出一个错误。

现在我只想要用户名字段unique,当group_id 插入时,已经有相同的用户名了。

所以基本上人们可以拥有相同的用户名,如果他们没有相同的group_id

我该怎么做?如果用户名已经存在于同一个group_id 下,我似乎无法找到如何检查规则。 The laravel validation documentation 对此一无所知。

【问题讨论】:

  • 也许你可以这样做:'email' => 'unique:users,email_address,NULL,id,account_id,1' "在上面的规则中,只有 account_id 为 1 的行才会包含在唯一检查中。"
  • @hebron 但这是在模型中,我想基本上只包含Input::get('group_id') 的 group_id 的行。我不能只在模型中使用它吗?
  • 文档确实有一章关于:Conditionally Adding Rules,但我从来没有玩过它。
  • @hebron 是的,但我似乎无法找到解决问题的方法。
  • 可能是模型创建事件中的某些内容并返回自定义错误消息并返回 false(取消创建)。

标签: php validation laravel


【解决方案1】:

其实很简单....只是扩展验证。

假设你的数组看起来像这样

$input = ['name' => 'mike', 'group' => 1];

写出常用的规则,

rules = ['name' => 'required|foo', 'group' => 'required'];

here foo 将是扩展规则。

现在,扩展它。

Validator::extend('foo', function($attribute, $value, $parameters) use($input)
        {
           $count = DB::select('SELECT COUNT(*) AS c FROM users 
           WHERE group_id=? AND username=?',[$input['group'], $input['name']]);
           return $count[0]->c;
        });

就是这样。

它可以工作,但我更喜欢在数据库中放置独特的约束并捕获错误并采取相应的措施。

【讨论】:

  • 我觉得这不是扩展验证的最佳方式。
  • 是的,它不是。最好的方法是将该条件放入数据库并捕获错误....不过,您可以使用模型使上面的内容变得优雅....上面只是一个示例。
  • 其实我找到了一个很好的方法。它实际上是希伯伦发布的那个。这正是我需要的,但我得到了一个错误。您还可以指定更多条件,这些条件将作为“where”子句添加到查询中:'email' => 'unique:users,email_address,NULL,id,account_id,1' 在上面的规则中,只有 account_id 为 1 的行才会包含在唯一检查中。我得到一个未定义的偏移量:1 但是当我删除:NULL,id 它不再给我错误,但它也不起作用。但是文档告诉我我需要这个。我不知道NULL,ID 做了什么
【解决方案2】:

它在 Laravel 文档中。 您只需要使用扩展的 UNIQUE 验证规则:

$this->validate($request, [
            'email' => 'unique:users,email_address,NULL,id,account_id,1'
        ]

在上述规则中,只有 account_id 为 1 的行才会包含在唯一检查中。

阅读更多: https://laravel.com/docs/5.2/validation#rule-distinct

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多