首页 > 解决方案 > 两个组合列的Laravel验证

问题描述

我是 Laravel 的新手,我需要一些验证帮助。我有两个字段,一个是国家代码,另一个是电话号码,它们分别存储在数据库的相应列中。我想验证电话号码是否唯一我想要的是获取电话号码 (1234567) country_Code(+12) 像 (+121234567) 一样加入它们,然后针对 db 列 country_Code(+12) + phone(1234567) 验证(唯一) )。我怎样才能做到这一点?

这是我的自定义表单请求的验证规则方法

public function rules()
{
    return [
        'first_name' => 'required|string',
        'last_name' => 'required|string',
        'email' => ['required', Rule::unique('clients')->ignore($this->client)],
        'country_code' => 'required',
        'phone' => ['required',Rule::unique('clients')->ignore($this->client)],
        'receive_video_lessons' => 'required|boolean'
    ];
}

标签: laravelvalidation

解决方案


您可以使用自定义规则。尝试这样的事情:

public function rules()
    {
        return [
            'first_name' => ['required', 'string'],
            'last_name' => ['required', 'string'],
            'email' => ['required', Rule::unique('clients')->ignore($this->client)],
            'country_code' => ['required'],
            'phone' => ['required', new IsValidPhoneNumber($this->country_code, $this->client)],
            'receive_video_lessons' => 'required|boolean'
        ];
    }

然后在您的自定义验证规则中:

class IsValidPhoneNumber implements Rule
{
    protected $countryCode;
    protected $clientId;

    public function __construct($countryCode, $clientId)
    {
        $this->countryCode = $countryCode;
        $this->clientId = $clientId;
    }

    public function passes($attribute, $value)
    {
        return ! Client::where('country_code', $this->countryCode)
            ->where('phone', $value)
            ->where('client_id', '!=', $this->clientId)
            ->exists();
    }

    public function message()
    {
        return 'This :attribute is not valid.';
    }
}

你可能需要按摩它才能工作,但你明白了。


推荐阅读