Laravel唯一字段验证问题(重复输入错误)

 收藏

在我的laravel应用数据库中,有一个名为apps的表

在该表中,我有一个列名“ domain”。域是唯一列。

问题

我的前端刀片中有一个供用户创建新应用的表单。在该表单中,用户应首先输入子域名,然后会出现一个下拉列表以选择域名。

一旦用户输入了子域名,然后选择了域名,我就会合并控制器中的两个输入,然后将合并后的值保存在“域”列中。

例如: 子域名:ABC 域名:TEST.SITE 合并值(我保存在域列中的值):ABC.TEST.SITE

现在,由于存在重复值,因此我的域是唯一的,因此我抛出了laravel错误,表示重复输入。

但是从我的控制器上,我无法验证输入的子域名,因为最后我要保存合并的值。

任何解决此问题并正确进行验证的解决方案,

这是表格的代码。

<form id="appform" action="{{ route('app.save') }}" method="post">
                        @csrf
                            <input type="text" id="app-subdomainname" class="form-control" name="subDomainName" placeholder="{{ __('sentence.Sub Domain Name') }}" aria-required="true">
                         <br>
                            <select id="app-subdomainsuffix" class="form-control" name="subDomainSuffix" aria-required="true">
                                <option value="">- {{ __('sentence.Select domains') }} -</option>
                                <option value="TEST.SITE">TEST.SITE</option>
                            </select>

                        <br>

                        <select id="app-packagetype" class="form-control" name="packageType" aria-required="true">
                            <option value="">- {{ __('sentence.Select package type') }} -</option>
                            @foreach($packages as $package)
                            <option value="{{$package->id}}">{{$package->name}}</option>
                                @endforeach
                        </select>

                        <br>
                            <select id="app-payment" class="form-control" name="paymentoption" aria-required="true">
                            </select>

                        <br>

                            <select id="app-themeid" class="form-control" name="themeid" aria-required="true">
                                <option value="">- {{ __('sentence.Select theme') }} -</option>
                                <option value="default">Starter</option>
                            </select>

                        <br>
                            <select id="app-lang" class="form-control" name="lang" aria-required="true">
                                <option value="">- {{ __('sentence.Select Language') }} -</option>
                                <option value="en">English</option>
                                <option value="jp">Japanese</option>
                            </select>
                        <br>

                        <div class="form-group">
                            <button type="submit" class="btn btn-success">{{ __('sentence.Save') }}</button>
                        </div>

                    </form>  

我的控制器(仅包含数据存储功能)

$this->validate($request, [
            'subDomainName' => 'required',
            'subDomainSuffix' => 'required',
            //'package_type' => 'required',
            'lang' => 'required',
            'theme' => 'required',
            'paymentoption' => 'required',

        ]);

        $user = Auth::user();
        $fullDomain = $request->subDomainName.'.'.$request->subDomainSuffix;
        $credentials = $this->generateDbcredentials();
        App::create([
            'domain' => $fullDomain,
            'masterUserId' => $user->id,
            'dbName' => $credentials[0],
            'host' =>env('DB_HOST', '127.0.0.1'),
            'username' => $credentials[1],
            'password' => $credentials[2],
            'theme' => $request->themeid,
            'lang' =>  $request->lang,
            'status' => 1,
            'package_type' => $request->packageType,
            'payment_option' => $request->paymentoption,
            'isAppCreated' => 1,
            'isDefault' =>0,
        ]);

我如何正确进行验证

谢谢。

回复
  • 尝试遵循验证规则

    $this->validate($request, [
        'subDomainName' => 'required',
        'subDomainSuffix' => 'required',
        //'package_type' => 'required',
        'lang' => 'required',
        'theme' => 'required',
        'paymentoption' => 'required',
        'domain'  => [
            'required',
            Rule::unique('apps')->where(function ($query) use ($request) {
                return $query->whereDomain($request->subDomainName.'.'.$request->subDomainSuffix);
            }),
        ]
    ],
    [
        'domain.unique' => __('messages.app.error.unique', [
            'subDomainName' => $request->subDomainName, 
            'subDomainSuffix' => $request->subDomainSuffix
        ]),
    ]);