In this article we will learn to handle the unique validation on update in laravel.As we know Laravel support validation for database operations. Laravel unique validation validates the table column uniqueness using unique validation. In this tutorial we will learn about the unique validation to table columns and also while updating the value too.
you can use this to check the uniqueness of email, username , name and id etc in any version of laravel 5, laravel 6, laravel 7, laravel 8 and laravel 9.
We will use one Laravel rules to validate the email here
- unique
So, it can be use in any controller or route as below
unique:table_name,column_name,except_column_id,column_name_in_table
so to use it at the time of update we can use as follow
'email' => 'required|email|unique:users,email,2,id'
Here unique
is the rule name, users
is table name, email
is column name, 2
is value of id field which we want to exclude(useful at the time of update record), id
name of column to match with(2).
Lets’ take a example Users table:
Table Name : Users
id | status | updated_at | created_at | |
unique:users,email,2,id
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class PostController extends Controller
{
function validateUnique($request Request){
$validator = Validator::make($request->all(), [
'email' => 'required|email|unique:users,email,2,id'
]);
}
}
Here, we used unique:users
unique is rule name and users is table name.
Column name is different from form name
if column name is different from column name of table then we can pass second parameter to unique validation
$validator = Validator::make($request->all(), [
'form_name' => ['required','unique:users,email']
]);
Unique validation on update with Rule
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Contracts\Validation\Rule;
class ArticleController extends Controller
{
function validateUnique($request Request){
$authUser = User::find(1);
$validator = Validato'r::make($request->all(), [
'email' => ["required","email",
Rule::unique('users')->ignore($authUser->id)]
]);
}
}
Let’s learn with simple example
Step 1 : Create a controller
Create the controller and add the necessary imports and class. You can create by Laravel artisan or manually.
php artisan make:controller PostController
Now, add use Illuminate\Support\Facades\Validator;
and methods
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Validator;
class PostController extends Controller
{
public function create()
{
return view('post.create');
}
public function save(Request $request, $id='')
{
$validator = Validator::make($request->all(), [
'name' => ['required','unique:posts,name,'.($id=='' ? 0 : $id).',id']
]); // create the validations
if ($validator->fails()) //check all validations are fine, if not then redirect and show error messages
{
return back()->withInput()->withErrors($validator);
// validation failed redirect back to form
}
else
{
//handle the form
}
}
}
Here, we added image validation using image,mimes and dimension.
Step 2 : Create Routes
Second step is to create the routes to show the form and submit the form
<?php
use Illuminate\Support\Facades\Route;
use \App\Http\Controllers\PostController;
Route::get('/create-post',[PostController::class, 'create']);
Route::post('/save-post',[PostController::class, 'save']);
Route::post('/save-post/$id',[PostController::class, 'save']);
Here, we created 3 routes one for show the form, second for create new post and third for updating the form.
Step 3 : Create the view for form
We have created routes and controller and now we need to create the form so we are creating the view file for it.
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Readerstacks laravel 8 unique validation</title>
<link href="//netdna.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" rel="stylesheet" />
</head>
<body class="antialiased">
<div class="container">
<!-- main app container -->
<div class="readersack">
<div class="container">
<div class="row">
<div class="col-md-6 offset-md-3">
<h3>Laravel 8 unique validation - Readerstacks</h3>
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form method="post" action="{{url('submit-post')}}" name="registerform">
<div class="form-group">
<label>Name</label>
<input type="text" name="name" value="{{old('name')}}" class="form-control" />
@csrf
</div>
<div class="form-group">
<button class="btn btn-primary">Post</button>
</div>
</form>
</div>
</div>
</div>
</div>
<!-- credits -->
<div class="text-center">
<p>
<a href="#" target="_top">Laravel 8 unique validation </a>
</p>
<p>
<a href="https://readerstacks.com" target="_top">readerstacks.com</a>
</p>
</div>
</div>
</body>
</html>