Laravel Validation: soft delete + unique email + update - php

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

Related

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

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

Laravel validation throws error on updating same unique value

I have a form which has an input name. I want to update a database table through that form. The only condition is, the name must be unique. So this is what I did for validation in the backend:
$this->validate($request, [
'name' => 'required|unique:myTableName'
]);
It's working as expected. It throws this error "The name has already been taken." when I try to enter a name which already exists in the database. But the problem I have with this is, when I'm updating the same entry from database without any change (I.E. I go to edit form, do nothing, update the form), it shows me the same error. In this case, I don't want the error as I'm updating the same value. How can I achieve this with laravel validation?
You have to use following code
$this->validate($request, [
'name' => ['required', Rule::unique('myTableName')->ignore($yourVariable->id)],
]);
Add header section below code
use Illuminate\Validation\Rule;
More Details here
You need to pass the table id, to ignore that field from validation
'name' => 'required|unique:myTableName,name,' . $table->id,
With custom Rule :
use Illuminate\Validation\Rule;
'name' => ['required', Rule::unique('myTableName', 'name')->ignore($table->id)],

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

Categories