Php 仅当存在具有相同组ID的输入时,Laravel才唯一

Php 仅当存在具有相同组ID的输入时,Laravel才唯一,php,validation,laravel,Php,Validation,Laravel,我目前有一个帐户创建和登录页面。在我的模型中,我对这两个页面都有规则,对于我的注册表,我的规则如下: public static $rules = [ 'username' => 'unique:users,username', 'group_id'=>'required', 'password' => 'required' ] 因此,当用户名已经存在时,这基本上就是一个错误 现在,我只希望用户名字段在插入组id时唯一,并且组id已经具有相同的用户名

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

public static $rules = [
    'username' => 'unique:users,username',
    'group_id'=>'required',
    'password' => 'required'
]
因此,当用户名已经存在时,这基本上就是一个错误

现在,我只希望用户名字段在插入组id时唯一,并且组id已经具有相同的用户名

因此,如果人们没有相同的群组id,他们基本上可以拥有相同的用户名


我该怎么做?如果用户名已经存在于同一个组id下,我似乎找不到如何检查规则。我没有对此做任何说明。

其实很简单。。。。只需扩展验证

假设您的数组如下所示

$input = ['name' => 'mike', 'group' => 1];
写下通常的规则

rules = ['name' => 'required|foo', 'group' => 'required'];
这里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;
        });
就这样


它可以工作,但我更喜欢在数据库中设置唯一的约束,捕捉错误并采取相应的措施

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

$this->validate($request, [
            'email' => 'unique:users,email_address,NULL,id,account_id,1'
        ]
在上面的规则中,只有帐户id为1的行才会包含在唯一检查中

阅读更多:

也许你可以这样做:'email'=>'unique:users,email\u address,NULL,id,account\u id,1'在上面的规则中,只有account\u id为1的行才会包含在unique check中。@hebron但这是在模型中,我基本上只想包含group\u id为输入::get'group\u id'的行。但我不能在模型中使用它?文档中有一章是关于:,但我从来没有玩过它。@hebron是的,但我似乎找不到解决问题的方法。可能是模型创建事件中的某个东西,返回自定义错误消息并返回false会取消创建。我感觉这不是扩展验证的最佳方法。是的,不是。最好的方法是将该条件放入数据库并捕获错误。。。。不过,你可以用一个模型使上面的内容变得优雅。。。。以上只是一个例子,我发现了一个很好的方法。实际上是希布伦贴的。这正是我所需要的,但我有一个错误。您还可以指定更多条件,这些条件将作为where子句添加到查询中:“电子邮件”=>“唯一:用户、电子邮件地址、NULL、id、帐户id、1”。在上述规则中,只有帐户id为1的行才会包含在唯一检查中。我得到一个未定义的偏移量:1,但当我删除:NULL,id时,它不再给我错误,但它也不起作用。但是文件告诉我我需要这个。我不知道空ID是做什么的