How to use Not Equal Validation in laravel - php

Hy! how can i use the not equal in validation
i'm using laravel 5.8. i want to do when i put the (name) something like Admin in input field at the submission of the form it show me error the You can't Use the Name Admin This is all for guest use. when the user is login the he/she can add this name

Laravel offers notIn validation rule for this:
Validator::make($data, [
'name' => [
'required',
Rule::notIn(['Admin']), // You can add more values to the array to black list it.
],
]);
Read more about this here.

Related

Laravel spatie roles unique validation for multiple id during update

I created a role "Administrator" but each has one unique guard. I successfully generated them by creating custom function that replicates the web guard to sanctum. Or vice-versa depending where the role is created (e.g react frontend->sanctum guard), or laravel -> web guard).
Roles table
My current request validation rule is this:
'name' => ['required', 'max:70', 'unique:roles,name,'. $this->role->id]
I also tried this, but this won't work because it's intended only for the current role
'name' => ['required', 'max:70', 'unique:roles,name,id']
It returns "The name has already been taken."
I can't update the Role because there's an existing role that have the same name. How can I make my Request to ignore the duplicate role?
The unique rule has been updated to be more flexible in modern versions of Laravel.
You can define your validation rule like this:
use Illuminate\Validation\Rule;
...
$rules = [
"name" => [
"required",
"max:70",
Rule::unique("roles")
->ignore($this->role->id)
->where("guard_name", $this->role->guard_name)
],
];
Additional where clauses were previously added with more parameters in the unique: comma-separated list (and still can be AFAIK) but it was very hard to tell at a glance what the validation was doing.

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

Upon validation laravel sends the column name to the user

I have the following validation code in a controller. The problem is that laravel is sending the column name in the validation error , which is most of the time abbreviations. In this case the column name is "ans". Is there a way to show a different name to the user ?
Validation :
$this->validate($request, [
'ans' => 'required|max:5000|min:10'
]);
Error :
The ans field is required.
If you want to customize the attribute name you can do that; you don't have to customize the message to do this. The validate method takes an array of "custom attribute names" to use (4th argument), just like it takes an array of custom messages (3rd argument).
$this->validate(
$request,
['ans' => 'required|max:5000|min:10'], // rules
[], // custom messages
['ans' => 'Answer'] // custom attribute names
);
You should always have the option to specify custom messages and attributes with the validation methods that are available. These custom attribute names get replaced in the messages where :attribute is used.
If you don't do it this way you would have to create 3 custom messages, one for each rule you have defined to use for your field 'ans', since any of those rules could fail and will include the attribute name.
Yes, you can achieve with the following code.
$this->validate($request, [
'ans' => 'required|max:5000|min:10'
], [
'ans.required' => 'The answer field is required.'
]);
Take a look at the laravel documentation to know more.
You can send custom validation message,define all
your validation message in a variable like this
$messages = [
'ans.required' => 'The answer field is required.'
]
$this->validate($request, [
'ans' => 'required|max:5000|min:10'
], $messages);
Thanks

Ignore category in update form

Im updating a category name, but i need to be unique and also case is the current record let it update, but it is not working my validation.
Example:
$this->validate($request, array(
'category' => 'required|unique:categories,name,:id|min:2'
));
From unique() rule description:
Sometimes, you may wish to ignore a given ID during the unique check. For example, consider an "update profile" screen that includes the user's name, e-mail address, and location. Of course, you will want to verify that the e-mail address is unique. However, if the user only changes the name field and not the e-mail field, you do not want a validation error to be thrown because the user is already the owner of the e-mail address.
To instruct the validator to ignore the user's ID, we'll use the Rule class to fluently define the rule. In this example, we'll also specify the validation rules as an array instead of using the | character to delimit the rules:
use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::unique('users')->ignore($user->id),
],
]);

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