Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 制作Laravel';s notIn验证规则不区分大小写_Php_Mysql_Forms_Laravel_Validation - Fatal编程技术网

Php 制作Laravel';s notIn验证规则不区分大小写

Php 制作Laravel';s notIn验证规则不区分大小写,php,mysql,forms,laravel,validation,Php,Mysql,Forms,Laravel,Validation,我正在数据库中存储一个字符串数组(db列类型为JSON)。有一个表单允许用户向该数组添加值。我要确保此数组中没有重复项。验证规则似乎是防止重复的最简单解决方案,但它区分大小写。因此,当使用notIn时,我无法阻止具有不同大小写的相同字符串 $this->validate(request(), [ 'choice' => [ 'required', Rule::notIn($choices) ] ]); 是否有人建议我如何修复此验证,以

我正在数据库中存储一个字符串数组(db列类型为JSON)。有一个表单允许用户向该数组添加值。我要确保此数组中没有重复项。验证规则似乎是防止重复的最简单解决方案,但它区分大小写。因此,当使用notIn时,我无法阻止具有不同大小写的相同字符串

$this->validate(request(), [
    'choice' => [
        'required',
        Rule::notIn($choices)
    ]
]);

是否有人建议我如何修复此验证,以便字符串比较不区分大小写?

您可以将输入数据和当前数据小写,如下所示:

$input = request()->all();
$input['choice'] = array_map("strtolower", $input['choice']);
$this->validate($input, [
    'choice' => [
        'required',
        Rule::notIn(array_map("strtolower", $choices))
    ]
]);

您可以将输入数据和当前数据小写,如下所示:

$input = request()->all();
$input['choice'] = array_map("strtolower", $input['choice']);
$this->validate($input, [
    'choice' => [
        'required',
        Rule::notIn(array_map("strtolower", $choices))
    ]
]);
谢谢,我能够将他的答案扩展到FormRequest类:

protected function validationData()
{
    $all = parent::validationData();
    //Convert request value to lowercase
    $all['choice'] = strtolower($all['choice']);
    return $all;
}

public function rules()
{
    $choices = $this->route('modelName')->choices;
    return [
        'choice' => [
            'required',
            //Also convert array to lowercase
            Rule::notIn(array_map('strtolower', $choices))
        ]
    ];
}
谢谢,我能够将他的答案扩展到FormRequest类:

protected function validationData()
{
    $all = parent::validationData();
    //Convert request value to lowercase
    $all['choice'] = strtolower($all['choice']);
    return $all;
}

public function rules()
{
    $choices = $this->route('modelName')->choices;
    return [
        'choice' => [
            'required',
            //Also convert array to lowercase
            Rule::notIn(array_map('strtolower', $choices))
        ]
    ];
}

您可以编写自己的验证规则类:

use Illuminate\Contracts\Validation\Rule;
use Illuminate\Validation\Concerns\ValidatesAttributes;
use Illuminate\Validation\Rules\In;

class CaseInsensitiveInRule extends In implements Rule
{
    use ValidatesAttributes;
    private const FORMAT_FUNCTION = 'strtoupper';

    public function __construct(array $values)
    {
        $this->values = array_map(self::FORMAT_FUNCTION, $values);
    }

    public function passes($attribute, $value)
    {
        $value = call_user_func(self::FORMAT_FUNCTION, $value);

        return $this->validateIn($attribute, $value, $this->values);
    }

    public function message()
    {
        return __('validation.invalid_value');
    }
}
接下来,您可以在请求类中创建一个对象

public function rules(): array
{
    return [
        'status' => new CaseInsensitiveInRule(['active', 'deleted'])
    ];
}

您可以编写自己的验证规则类:

use Illuminate\Contracts\Validation\Rule;
use Illuminate\Validation\Concerns\ValidatesAttributes;
use Illuminate\Validation\Rules\In;

class CaseInsensitiveInRule extends In implements Rule
{
    use ValidatesAttributes;
    private const FORMAT_FUNCTION = 'strtoupper';

    public function __construct(array $values)
    {
        $this->values = array_map(self::FORMAT_FUNCTION, $values);
    }

    public function passes($attribute, $value)
    {
        $value = call_user_func(self::FORMAT_FUNCTION, $value);

        return $this->validateIn($attribute, $value, $this->values);
    }

    public function message()
    {
        return __('validation.invalid_value');
    }
}
接下来,您可以在请求类中创建一个对象

public function rules(): array
{
    return [
        'status' => new CaseInsensitiveInRule(['active', 'deleted'])
    ];
}