Is there is any except validation with unique number in laravel? - php

Can someone help me out to find out how to validate unique emails with some emails that are exceptional.
Here is and example:
we have two emails:
[xxx#xxxx.com, yyyy#yyy.com]
Laravel provide us validation rule:
'email' => 'required|email|unique:users',
so when we register in our web app, these two emails should be ignore while searching for unique user's email in users table.
Thank you in Advance!
I have tried this but it didn't help:
'email' => 'required|email|unique:users,email,[xxx#xxxx.com, yyyy#yyy.com]',
and
'email' => 'required|email|unique:users,email.'[xxx#xxxx.com, yyyy#yyy.com]',
But didn't get any results.

use laravel custom unique rule.You may specify additional query conditions by customizing the query using the where method.
'email' =>[
'required',
'email',
Rule::unique('users')->where(fn($query) => $query->whereNotIn('email', ['xxx#xxxx.com', 'yyyy#yyy.com']))
]

Related

Laravel Validation: soft delete + unique email + update

I'm trying to set up a client registration check and profile edit.
I'm using soft delete
E-mail has to be unique (not counting the delted ones of course)
If profile is edited (id is present) it has to ignore that fields email
So far I have
'email' => [
'required',
'email',
'unique:clients,email,NULL,deleted_at,deleted_at,NULL',
],
Now this works correctly and detects the unique emails that are not deleted, but it gives me errors when I need to edit the profile off the client. I tried adding additional unique settings, but they seem to be getting ignored:
'email' => [
'required',
'email',
'unique:clients,email,NULL,deleted_at,deleted_at,NULL',
Rule::unique('clients')->ignore('id', (int)$request->input('id')) // <- from Laravel docs, but is not working
],
I found solutions with only one of these requirements, but I can't seem to combine them.
Edit: The fix was
'email'=>['required','email',Rule::unique('clients','email')->ignore($request->input('id'))->whereNull('deleted_at')],
try this
$this->validate($request,[
'email'=>['required','email',Rule::unique('clients','email')->ignore($id)->whereNull('deleted_at')]
]);

Ignore a unique role with custom key - Laravel - Mongodb

In my project with Laravel 5.6 and MongoDB, to validate my inputs in an update method, I use a validator like below,
$validator = Validator::make($request->all(), [
'name' => 'string|max:255',
'phone' => 'string|valid_phone',
'email' => ['string', 'email', 'max:255',
Rule::unique('admins','email')->ignore($id),
],
'password' => 'string|min:6',
'access' => 'numeric',
]);
I want the field to be unique and ignore the same email for the user with special $id.
Everything looks Ok! But when I call my route to update my user and pass the current email of the user as email, It returns a validator error like this,
"email": [
"The email has already been taken."
]
So, the unique validation did not work correctly!
I also have been set the $primaryKey='_id'; in my user model.
What's the problem? Have I missed something?
If you use $primaryKey='_id' in user model you should set second parameter in ignore method. Below is a quote from documentation:
If your table uses a primary key column name other than id, you may
specify the name of the column when calling the ignore method
Rule::unique('admins','email')->ignore($id,'_id')

Validation form unique Laravel 5.4 doesn't work

I have this simple code:
$this->validate($request, [
'email' => 'required|email|unique:subscriptions'
]);
However I can keep putting in the same email and it doesn't send me back and error and keeps creating the row in the database.
However if I change the code to ..
$this->validate($request, [
'email' => 'required|email|unique:users'
]);
It sends me back an error properly and displays in the div I have setup for it.
I have tried many different ways to fix this, but I feel like it should be easier than this. I looked at everything and it doesn't seem to address this issue. Any help would be great.
You need to specify the column name
$this->validate($request, [
'email' => 'required|email|unique:subscriptions,email'
]);
$this->validate($request, [
'email' => 'required|email|unique:users,email'
]);
While updating you need to force a unique rule to Ignore Given ID
'email' => 'unique:subscriptions,email,'.$user->id
https://laravel.com/docs/5.2/validation#rule-unique

Laravel Illuminate\Validation\Rule not found

I am trying to submit a form and validate the content.
In one of the requests I need to make a special rule.
I followed the documentation and it says to use unique and declare a Rule.
use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::unique('users')->ignore($user->id),
],
]);
I am trying with the example from the documentation, but all I get it this error:
Class 'Illuminate\Validation\Rule' not found
I declared the line
use Illuminate\Validation\Rule;
In my controller, but the error is still there.
The Rule class in the example you posted is for validate an unique field. For examplo if you have an email you will want to be unique in the table, when you are going to edit the record, at saving, will get a validator error because you are saving the same email it is already in the db.
The example you posted:
use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::unique('users')->ignore($user->id),
],
]);
is related to this case, editing a record and validating the email (unique in table users). This example avoid to validate the email against the same user-
For using it you have to add the class (not included in the laravel installator). Here you have it.
In your question you say about using the unique rule. The unique rule is for fields that has to be unique in a table, an email, an personal identification (law), and more. Verify if the unique rule is what you need.
You dont have to use the Rule class for this.
Simply achieve the same with following rule:
'email' => 'required|unique:users,email,' . $user->id
The Illuminate\Validation\Rule class has been added on Laravel 5.3+.
I almot sure you have tested with an old laravel version.
See issue (PR) 15809: [5.3] Object based unique and exists rules for validation.
I had that problem on version v5.3. I just updated to the latest patch version (v5.3.31 in my case) and all worked correctly!
use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::unique('users')->ignore($user->id),
],
]);
You have done everything ok so far until you add the line
"Rule::unique('users')->ignore($user->id)"
The only reason why this is not working is because you are not specifying the column name you want to be unique. Let's assume that, in your database, the column name of the table users that you want to be unique is "email". Then, your code should be as follows:
use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::unique('users', 'email')->ignore($user->id),
],
]);
Thus,
//Right Way
"Rule::unique('users', 'email')->ignore($user->id)"
//Wrong Way
"Rule::unique('users')->ignore($user->id)"
Why don't you try in you method something like this:
$validator = Validator::make($request->all(), [
'email' => 'required|unique:<table_name>',
]);
if ($validator->fails()) {
...
}
If you column if also named email laravel will know automaticly, else do
required|unique:<table_name>,<column_name>
Here is a link to the documentation validation section: https://laravel.com/docs/5.3/validation

How to use required_unless in laravel

I have gone through the validations in Laravel. I have taken so many validation rules from Laravel Validations Rules
I want to user required_unless rule for following conditions.
$rules = array(
'facebookID' => 'alpha_num',
'googleID' => 'alpha_num',
'email' => 'required_unless:facebookID,null|required_unless:facebookID,null|email|max:32',
'password' => 'required_unless:facebookID,""|required_unless:googleID,""|max:20',
);
I want to add validation rule of email and password is only required if signup with facebook or google is not attempted.
I believe we can use required_unless or required_if
Please help me to solve this problem.
The laravel validation rule only accept value, that's mean required_unless:facebookID,null is evaluated as: the field is required unless facebookID='null'. So it's not a case you would need.
My suggest solution is using require_without_all:
'email' => 'required_without_all:facebookID,googleID',
'password' => 'required_without_all:facebookID,googleID'
The reference link for you: https://laravel.com/docs/5.1/validation#rule-required-without-all
Regards

Categories