通过Laravel中的Request检查复合唯一索引输入

时间:2016-04-28 22:08:05

标签: php laravel httprequest laravel-5.1

我的网站有多个实例(公司)。

每家公司都可以添加自己的广告资源,unit号码在实例(公司)中必须是唯一的。但我希望每个公司允许相同的单位数。因此,unit+ instance_id必须是唯一的。有没有办法在请求规则中实现此检查?

以下规则检查清单中是否已存在单位。我需要添加inventory.id AND inventory_instance_id

的检查
public function rules() {
    return [
        'unit' => 'unique:inventory|required|max:45',
        'comments' => 'sometimes|max:255'
    ];
}

public function messages() {
    return [
        'unit.unique' => 'Unit number already exists!',
        'unit.required' => 'Enter Unit Number!',
        'max' => ':attribute - Should not be longer than 255 symbols!'
    ];
}

2 个答案:

答案 0 :(得分:2)

unique验证允许许多参数。语法大致为unique:table,column,except,idColumn,whereN,valueN

第一个参数是表,第二个是要唯一的字段,第三个是要忽略的id,第四个是第三个参数的id列,然后是第四个和第五个(和第六个/第七个等等... )允许您为唯一验证指定其他where子句。这就是你要找的东西。

您可以使用第四个和第五个参数指定您的单位在指定的实例ID中必须是唯一的。假设您的实例ID存储在inventory.instance_id中,并且您在名为$instanceId的变量中具有该字段的值,那么您的规则将类似于:

public function rules() {
    $instanceId = 1;
    return [
        'unit' => 'unique:inventory,unit,NULL,id,instance_id,'.$instanceId.'|required|max:45',
        'comments' => 'sometimes|max:255'
    ];
}

正如您可能已经猜到的,您现在的一个问题是您的规则是动态生成的。您需要找出一种方法,使用您要检查的实例ID来更新规则。

答案 1 :(得分:0)

检查此套餐:https://github.com/felixkiss/uniquewith-validator

我认为它解决了你的问题。