Уникальная проверка для столбца Phone No в Laravel Controller не работает должным образом

Я хочу проверить столбец «Электронная почта» и столбец «Нет телефона» как уникальные. Номер телефона передается в базу данных как объединение телефонного кода и номера телефона. Вот мой код.

public function customRegistration(Request $request)
{
    $request->validate([
        'name' => 'required',
        'email' => 'required|email|unique:users',
        'country' => 'required',
        'phone_no' => 'required|unique:users',
        'password' => 'required',
    ]);

    $data = $request->all();
    $check = $this->create($data);

    return redirect('login')->with('message', 'Signing up successful !!!');
}


public function create(array $data)
{
    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'country' => $data['country'],
        'phone_no' => $data['calling_code'] . '-' . $data['phone_no'],
        'password' => Hash::make($data['password']),
    ]);
}

В приведенном выше коде проверка электронной почты работает отлично. Но этот же номер телефона нельзя занести в БД. Правило проверки не работает на телефоне нет. Я не мог найти, где ошибка. Где я должен измениться, чтобы подтвердить номер телефона как уникальный?

"Правило проверки не работает на телефоне нет" Правило проверки действительно работает. Проблема в том, что вы не добавляете phone_no в базу данных, а добавляете другое значение

brombeer 23.05.2023 08:33
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
1
73
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Обновлено:

(Благодаря @brombeer, я заметил, что вы вставляете значения путем конкатенации, сравнивая начальное значение с конкатенированным уже в базе данных, что означает, что вы не применяли уникальность в базе данных)

Итак, вы можете сделать это как красивый принятый ответ, или вы можете просто подтвердить его, например,

'phone_number' => [
        'required',
        function ($attribute, $value, $fail) use ($request) {
            $callingCode = $request->input('calling_code');
            $phoneNumber = $callingCode. '-' . $value;
            $exists = User::where('phone_number', $phoneNumber)->exists();

            if ($exists) {
                $fail('The ' . $attribute . ' has already been taken.');
            }
        },
    ],

Не решит проблему, так как OP вставляет не номер телефона, а составное значение.

brombeer 23.05.2023 08:35
$fail(...) выглядит неправильно
brombeer 23.05.2023 13:00

Ну, это делает свою часть, не могли бы вы уточнить?

Mahin Rahman 24.05.2023 16:01
Ответ принят как подходящий

Вы можете создать пользовательское правило проверки для проверки уникальности номера телефона.

php artisan make:rule UniquePhoneNumber

app/Rules/UniquePhoneNumber.php

<?php
 
namespace App\Rules;
 
use Closure;
use App\Models\User;
use Illuminate\Contracts\Validation\ValidationRule;
 
class UniquePhoneNumber implements ValidationRule
{
    /**
     * Run the validation rule.
     */
    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        return User::where('phone_no', request('calling_code') . '-' . $value)
                    ->doesntExist();
    }
}

Затем используйте новое пользовательское правило проверки:

use App\Rules\UniquePhoneNumber;

public function customRegistration(Request $request)
{
    $request->validate([
        'name' => 'required',
        'email' => 'required|email|unique:users',
        'country' => 'required',
        'phone_no' => ['required', new UniquePhoneNumber],
        'password' => 'required',
    ]);

    $data = $request->all();
    $check = $this->create($data);

    return redirect('login')->with('message', 'Signing up successful !!!');
}

Другие вопросы по теме