Я хочу проверить столбец «Электронная почта» и столбец «Нет телефона» как уникальные. Номер телефона передается в базу данных как объединение телефонного кода и номера телефона. Вот мой код.
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']),
]);
}
В приведенном выше коде проверка электронной почты работает отлично. Но этот же номер телефона нельзя занести в БД. Правило проверки не работает на телефоне нет. Я не мог найти, где ошибка. Где я должен измениться, чтобы подтвердить номер телефона как уникальный?



Обновлено:
(Благодаря @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 вставляет не номер телефона, а составное значение.
Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, отредактируйте , чтобы добавить дополнительные сведения, такие как цитаты или документация, чтобы другие могли подтвердить правильность вашего ответа. Вы можете найти больше информации о том, как писать хорошие ответы в справочном центре.
$fail(...) выглядит неправильно
Ну, это делает свою часть, не могли бы вы уточнить?
Вы можете создать пользовательское правило проверки для проверки уникальности номера телефона.
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 !!!');
}
"Правило проверки не работает на телефоне нет" Правило проверки действительно работает. Проблема в том, что вы не добавляете phone_no в базу данных, а добавляете другое значение