Welcome To ITSolutionsGuides,
In this tutorial we will see how to create CRUD( Create, Read, Update, Delete ) operation using ajax in laravel 11. We have already learnedCRUD operation in laravel 11 in that tutorial we have used multiple blade files to perform the CRUD operation but in Ajax CRUD tutorial we will use only one single blade file for CRUD operations. In this example we will use the products table by performing CRUD( Create, Read, Update, Delete ) operations and also we will use the Yajra Datatable package to display the data which offers filtering, sorting, searching options by default, So lets see how to create CRUD operation using ajax in laravel 11.
Lets install a new laravel project using the following command
laravel new crud_ajax
then lets install the Yajra Datatable composer package using the following command,Full guide of Yajra Datatable installation
composer require yajra/laravel-datatables
then lets configure the database by updating the .env file database configuation,
.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=here your database name
DB_USERNAME=here database username
DB_PASSWORD=here database password
Lets create both the model and the migration by using the " -m " flag in the artisan command,
php artisan make:model Product -m
app/Models/Product.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
use HasFactory;
/**
* Write code on Method
*
* @return response()
*/
protected $fillable = [
'name', 'detail'
];
}
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up(): void
{
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->text('detail');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down(): void
{
Schema::dropIfExists('products');
}
};
after editing the migration file lets run the following artisan command to create migrations,
php artisan migrate
routes/web.php
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ProductController;
Route::resource('products', ProductController::class);
Lets create the controller using the following artisan command,
php artisan make:controller ProductController
app/Http/Controllers/ProductController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Product;
use DataTables;
use Illuminate\Http\JsonResponse;
class ProductController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
{
if ($request->ajax()) {
$data = Product::query();
return Datatables::of($data)
->addIndexColumn()
->addColumn('action', function($row){
$btn = '<a href="javascript:void(0)" data-toggle="tooltip" data-id="'.$row->id.'" data-original-title="View" class="me-1 btn btn-info btn-sm showProduct"><i class="fa-regular fa-eye"></i> View</a>';
$btn = $btn. '<a href="javascript:void(0)" data-toggle="tooltip" data-id="'.$row->id.'" data-original-title="Edit" class="edit btn btn-primary btn-sm editProduct"><i class="fa-regular fa-pen-to-square"></i> Edit</a>';
$btn = $btn.' <a href="javascript:void(0)" data-toggle="tooltip" data-id="'.$row->id.'" data-original-title="Delete" class="btn btn-danger btn-sm deleteProduct"><i class="fa-solid fa-trash"></i> Delete</a>';
return $btn;
})
->rawColumns(['action'])
->make(true);
}
return view('products');
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request): JsonResponse
{
$request->validate([
'name' => 'required',
'detail' => 'required',
]);
Product::updateOrCreate([
'id' => $request->product_id
],
[
'name' => $request->name,
'detail' => $request->detail
]);
return response()->json(['success'=>'Product saved successfully.']);
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Product $product
* @return \Illuminate\Http\Response
*/
public function show($id): JsonResponse
{
$product = Product::find($id);
return response()->json($product);
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Product $product
* @return \Illuminate\Http\Response
*/
public function edit($id): JsonResponse
{
$product = Product::find($id);
return response()->json($product);
}
/**
* Remove the specified resource from storage.
*
* @param \App\Product $product
* @return \Illuminate\Http\Response
*/
public function destroy($id): JsonResponse
{
Product::find($id)->delete();
return response()->json(['success'=>'Product deleted successfully.']);
}
}
Create blade file using artisan command
Since laravel verify each and every request with csrf token and we are using the ajax for sending the request in order to use csrf token in ajax we should add meta tag to generate the csrf token ane we will use it in script like
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
we will use these header while sending the request,
resources/views/products.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Ajax CRUD Operation In Laravel 11 Example</title>
<meta name="csrf-token" content="{{ csrf_token() }}">
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/5.0.1/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.datatables.net/1.11.4/css/dataTables.bootstrap5.min.css" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.5.1.js"></script>
<script src="https://cdn.datatables.net/1.11.4/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.11.4/js/dataTables.bootstrap5.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" ></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" />
</head>
<body>
<div class="container">
<div class="card mt-5">
<h2 class="card-header"><i class="fa-regular fa-credit-card"></i> Ajax CRUD Operation In Laravel 11 Example</h2>
<div class="card-body">
<div class="d-grid gap-2 d-md-flex justify-content-md-end mb-3">
<a class="btn btn-success btn-sm" href="javascript:void(0)" id="createNewProduct"> <i class="fa fa-plus"></i> Create New Product</a>
</div>
<table class="table table-bordered data-table">
<thead>
<tr>
<th width="60px">No</th>
<th>Name</th>
<th>Details</th>
<th width="280px">Action</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
<div class="modal fade" id="ajaxModel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="modelHeading"></h4>
</div>
<div class="modal-body">
<form id="productForm" name="productForm" class="form-horizontal">
<input type="hidden" name="product_id" id="product_id">
@csrf
<div class="alert alert-danger print-error-msg" style="display:none">
<ul></ul>
</div>
<div class="form-group">
<label for="name" class="col-sm-2 control-label">Name:</label>
<div class="col-sm-12">
<input type="text" class="form-control" id="name" name="name" placeholder="Enter Name" value="" maxlength="50">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">Details:</label>
<div class="col-sm-12">
<textarea id="detail" name="detail" placeholder="Enter Details" class="form-control"></textarea>
</div>
</div>
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-success mt-2" id="saveBtn" value="create"><i class="fa fa-save"></i> Submit
</button>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="modal fade" id="showModel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="modelHeading"><i class="fa-regular fa-eye"></i> Show Product</h4>
</div>
<div class="modal-body">
<p><strong>Name:</strong> <span class="show-name"></span></p>
<p><strong>Detail:</strong> <span class="show-detail"></span></p>
</div>
</div>
</div>
</div>
</body>
<script type="text/javascript">
$(function () {
/*------------------------------------------
--------------------------------------------
Pass Header Token
--------------------------------------------
--------------------------------------------*/
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
/*------------------------------------------
--------------------------------------------
Render DataTable
--------------------------------------------
--------------------------------------------*/
var table = $('.data-table').DataTable({
processing: true,
serverSide: true,
ajax: "{{ route('products.index') }}",
columns: [
{data: 'DT_RowIndex', name: 'DT_RowIndex'},
{data: 'name', name: 'name'},
{data: 'detail', name: 'detail'},
{data: 'action', name: 'action', orderable: false, searchable: false},
]
});
/*------------------------------------------
--------------------------------------------
Click to Button
--------------------------------------------
--------------------------------------------*/
$('#createNewProduct').click(function () {
$('#saveBtn').val("create-product");
$('#product_id').val('');
$('#productForm').trigger("reset");
$('#modelHeading').html("<i class='fa fa-plus'></i> Create New Product");
$('#ajaxModel').modal('show');
});
/*------------------------------------------
--------------------------------------------
Click to Edit Button
--------------------------------------------
--------------------------------------------*/
$('body').on('click', '.showProduct', function () {
var product_id = $(this).data('id');
$.get("{{ route('products.index') }}" +'/' + product_id, function (data) {
$('#showModel').modal('show');
$('.show-name').text(data.name);
$('.show-detail').text(data.detail);
})
});
/*------------------------------------------
--------------------------------------------
Click to Edit Button
--------------------------------------------
--------------------------------------------*/
$('body').on('click', '.editProduct', function () {
var product_id = $(this).data('id');
$.get("{{ route('products.index') }}" +'/' + product_id +'/edit', function (data) {
$('#modelHeading').html("<i class='fa-regular fa-pen-to-square'></i> Edit Product");
$('#saveBtn').val("edit-user");
$('#ajaxModel').modal('show');
$('#product_id').val(data.id);
$('#name').val(data.name);
$('#detail').val(data.detail);
})
});
/*------------------------------------------
--------------------------------------------
Create Product Code
--------------------------------------------
--------------------------------------------*/
$('#productForm').submit(function(e) {
e.preventDefault();
let formData = new FormData(this);
$('#saveBtn').html('Sending...');
$.ajax({
type:'POST',
url: "{{ route('products.store') }}",
data: formData,
contentType: false,
processData: false,
success: (response) => {
$('#saveBtn').html('Submit');
$('#productForm').trigger("reset");
$('#ajaxModel').modal('hide');
table.draw();
},
error: function(response){
$('#saveBtn').html('Submit');
$('#productForm').find(".print-error-msg").find("ul").html('');
$('#productForm').find(".print-error-msg").css('display','block');
$.each( response.responseJSON.errors, function( key, value ) {
$('#productForm').find(".print-error-msg").find("ul").append('<li>'+value+'</li>');
});
}
});
});
/*------------------------------------------
--------------------------------------------
Delete Product Code
--------------------------------------------
--------------------------------------------*/
$('body').on('click', '.deleteProduct', function () {
var product_id = $(this).data("id");
confirm("Are You sure want to delete?");
$.ajax({
type: "DELETE",
url: "{{ route('products.store') }}"+'/'+product_id,
success: function (data) {
table.draw();
},
error: function (data) {
console.log('Error:', data);
}
});
});
});
</script>
</html>
Lets run the laravel application using the artisan command,
php artisan serve
We hope it helps everyone. Thanks for supporting ITSolutionsGuides and keep supporting us also follow us in social media platforms.
Be the first to know about releases and tutorial news and solutions.
We care about your data in our privacy policy.
ITSolutionsGuides was started mainly to provide good and quality web solutions for all the developers. We provide tutorials to support all the developers and also we try to provide solutions to the errors we face while coding.
Copyright © 2023 - 2024 All rights reserved | ITSolutionsGuides