Проблема проверки уникального поля Laravel (ошибка повторяющегося ввода)

В моей базе данных приложений laravel у меня есть таблица с названием

В этой таблице у меня есть имя столбца, «домен». Домен - это уникальный столбец.

Проблема

В моем внешнем блейде есть форма, позволяющая пользователю создать новое приложение. Из этой формы пользователь должен сначала ввести имя субдомена, и есть раскрывающийся список для выбора имени домена.

Когда пользователь вводит имя субдомена, а затем выбирает имя домена, я объединяю два входа с моего контроллера, а затем это объединенное значение сохраняется в столбце «домен».

Пример: Имя субдомена: 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', 飗.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,
        ]);

Как я могу сделать проверку правильно

Спасибо.

Всего 2 ответа


Попробуйте придерживаться правила проверки

$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
    ]),
]);

Прежде всего, он всегда выдает ошибку, потому что вы делаете неправильно с HTML-именем элемента и идентификатором, пожалуйста, напишите в правиле преобразования имен

 'package_type' => 'required', worng with name.

 'theme' => 'required',wrong with name.

он никогда не делал проверку, которую вы хотите.

Ваша уникальная проверка домена здесь

'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
]),

я надеюсь, что его работа, если не сказать мне в комментариях


Есть идеи?

10000