Download Laravel App
https://laravel.com/docs/11.x/installation
Connecting our Database
open .env file root directory.
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=8889
DB_DATABASE=laravel11dev
DB_USERNAME=root
DB_PASSWORD=root
Database Migration
php artisan make:model Country -m
C:\xampp\htdocs\laravel\my-app>php artisan make:model Country -m
database/migrations/create_countries_table.php
Country
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | //database/migrations/create_countries_table.php <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { /** * Run the migrations. */ public function up() { Schema::create( 'countries' , function (Blueprint $table ) { $table ->id(); $table ->string( 'name' ); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists( 'countries' ); } }; |
php artisan make:model State -m
C:\xampp\htdocs\laravel\my-app>php artisan make:model State -m
database/migrations/create_states_table.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | //<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { /** * Run the migrations. */ public function up() { Schema::create( 'states' , function (Blueprint $table ) { $table ->id(); $table ->string( 'name' ); $table ->integer( 'country_id' ); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists( 'states' ); } }; |
php artisan make:model City -m
C:\xampp\htdocs\laravel\my-app>php artisan make:model City -m
database/migrations/create_cities_table.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | //database/migrations/create_cities_table.php <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { /** * Run the migrations. */ public function up() { Schema::create( 'cities' , function (Blueprint $table ) { $table ->id(); $table ->string( 'name' ); $table ->integer( 'state_id' ); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists( 'cities' ); } }; |
Create Controller
php artisan make:controller AccountController
C:\xampp\htdocs\laravel\my-app>php artisan make:controller AccountController
app/Http/Controllers/AccountController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | //app/Http/Controllers/AccountController.php <?php namespace App\Http\Controllers; use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\DB; class AccountController extends Controller { public function index(){ $countries = \DB::table( 'countries' )->orderBy( 'name' , 'ASC' )->get(); $data [ 'countries' ] = $countries ; return view( 'users.create' , $data ); } public function fetchStates( $country_id = null) { $states = \DB::table( 'states' )->where( 'country_id' , $country_id )->get(); return response()->json([ 'status' => 1, 'states' => $states ]); } public function fetchCities( $state_id = null) { $cities = \DB::table( 'cities' )->where( 'state_id' , $state_id )->get(); return response()->json([ 'status' => 1, 'cities' => $cities ]); } public function save(Request $request ){ $validator = Validator::make( $request ->all(),[ 'name' => 'required' , 'email' => 'required|email' ]); if ( $validator ->passes()) { User::create([ 'name' => $request ->name, 'email' => $request ->email, 'password' => "123456" , 'country' => $request ->country, 'state' => $request ->state, 'city' => $request ->city, ]); $request ->session()->flash( 'success' , 'User added successfully.' ); return response()->json([ 'status' => 1 ]); } else { // return error return response()->json([ 'status' => 0, 'errors' => $validator ->errors() ]); } } public function list() { $users = DB::table( 'users' )->get(); $data [ 'users' ] = $users ; return view( 'users.list' , $data ); } public function edit( $id ) { $user = User::where( 'id' , $id )->first(); $countries = \DB::table( 'countries' )->orderBy( 'name' , 'ASC' )->get(); $data [ 'countries' ] = $countries ; $states = \DB::table( 'states' )->where( 'country_id' , $user ->country)->orderBy( 'name' , 'ASC' )->get(); $data [ 'states' ] = $states ; $cities = \DB::table( 'cities' )->where( 'state_id' , $user ->state)->orderBy( 'name' , 'ASC' )->get(); $data [ 'cities' ] = $cities ; if ( $user == null ) { return redirect(url( '/list' )); } $data [ 'user' ] = $user ; return view( 'users.edit' , $data ); } public function update( $id , Request $request ){ $user = User::find( $id ); if ( $user == null) { $request ->session()->flash( 'error' , 'Enither user deleted or not found.' ); return response()->json([ 'status' => '400' ]); } $validator = Validator::make( $request ->all(),[ 'name' => 'required' , 'email' => 'required|email' ]); if ( $validator ->passes()) { $user ->name = $request ->name; $user ->email = $request ->email; $user ->country = $request ->country; $user ->state = $request ->state; $user ->city = $request ->city; $user ->save(); $request ->session()->flash( 'success' , 'User updated successfully.' ); return response()->json([ 'status' => 1 ]); } else { // return error return response()->json([ 'status' => 0, 'errors' => $validator ->errors() ]); } } } |
routes/web.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | //routes/web.php <?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\AccountController; Route::get( '/' , function () { return view( 'welcome' ); }); Route::get( '/create' , [AccountController:: class , 'index' ]); Route::post( '/fetch-states/{id}' , [AccountController:: class , 'fetchStates' ]); Route::post( '/fetch-cities/{id}' , [AccountController:: class , 'fetchCities' ]); Route::post( '/save' , [AccountController:: class , 'save' ]); Route::get( '/list' , [AccountController:: class , 'list' ]); Route::get( '/edit/{id}' , [AccountController:: class , 'edit' ]); Route::post( '/edit/{id}' , [AccountController:: class , 'update' ]); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 | //resources/views/users/create.blade.php <!DOCTYPE html> <html lang= "en" > <head> <meta charset= "UTF-8" > <meta name= "viewport" content= "width=device-width, initial-scale=1.0" > <meta http-equiv= "X-UA-Compatible" content= "ie=edge" > <title>Dynamic Dependent Dropdown</title> <link href= "https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel= "stylesheet" integrity= "sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin= "anonymous" > <meta name= "_token" content= "{{ csrf_token() }}" > </head> <body> <div class = "bg p-3 shadow-lg text-center" > <h4>Laravel Dynamic Dependent Dropdown | Country State City | Jquery AJAX</h4> </div> <div class = "container mt-3" > <div class = "row d-flex justify-content-center" > <div class = "col-md-6" > <a href= "{{ url('/list') }}" class = "btn btn-primary mb-3" >Back</a> <div class = "card card-primary p-4 border-0 shadow-lg" > <form action= "" id= "frm" name= "frm" method= "post" > <div class = "card-body" > <h3>Create User</h3> <div class = "mb-3" > <input type= "text" class = "form-control-lg form-control" name= "name" id= "name" placeholder= "Enter Name" > <p class = "invalid-feedback" id= "name-error" ></p> </div> <div class = "mb-3" > <input type= "text" class = "form-control-lg form-control" name= "email" id= "email" placeholder= "Enter Email" > <p class = "invalid-feedback" id= "email-error" ></p> </div> <div class = "mb-3" > <select name= "country" id= "country" class = "form-control-lg form-select" > <option value= "" >Select Country</option> @ if (! empty ( $countries )) @ foreach ( $countries as $country ) <option value= "{{ $country->id }}" >{{ $country ->name }}</option> @ endforeach @ endif </select> </div> <div class = "mb-3" > <select name= "state" id= "state" class = "form-control-lg form-select" > <option value= "" >Select State</option> </select> </div> <div class = "mb-3" > <select name= "city" id= "city" class = "form-control-lg form-select" > <option value= "" >Select City</option> </select> </div> <div class = "d-grid" > <button class = "btn btn-primary btn-lg" >Create</button> </div> </div> </form> </div> </div> </div> </div> <script src= "https://code.jquery.com/jquery-3.7.1.min.js" ></script> <!--https://blog.jquery.com/2023/08/28/jquery-3-7-1-released-reliable-table-row-dimensions/ https://getbootstrap.com/ --> <script src= "https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity= "sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin= "anonymous" ></script> <script> $.ajaxSetup({ headers: { 'X-CSRF-TOKEN' : $( 'meta[name="_token"]' ).attr( 'content' ) } }); $(document).ready( function () { $( "#country" ).change( function () { var country_id = $(this).val(); if (country_id == "" ) { var country_id = 0; } //alert(country_id); $.ajax({ url: '{{ url("/fetch-states/") }}/' + country_id, type: 'post' , dataType: 'json' , success: function (response) { $( '#state' ).find( 'option:not(:first)' ).remove(); $( '#city' ).find( 'option:not(:first)' ).remove(); if (response[ 'states' ].length > 0) { $.each(response[ 'states' ], function (key, value) { $( "#state" ).append( "<option value='" + value['id '] + "' >" + value[ 'name' ] + "</option>" ) }); } } }); }); $( "#state" ).change( function () { var state_id = $(this).val(); //console.log(state_id); if (state_id == "" ) { var state_id = 0; } $.ajax({ url: '{{ url("/fetch-cities/") }}/' + state_id, type: 'post' , dataType: 'json' , success: function (response) { $( '#city' ).find( 'option:not(:first)' ).remove(); if (response[ 'cities' ].length > 0) { $.each(response[ 'cities' ], function (key, value) { $( "#city" ).append( "<option value='" + value['id '] + "' >" + value[ 'name' ] + "</option>" ) }); } } }); }); }); $( "#frm" ).submit( function (event) { event.preventDefault(); $.ajax({ url: '{{ url("/save") }}' , type: 'post' , data: $( "#frm" ).serializeArray(), dataType: 'json' , success: function (response) { alert(response[ 'status' ]); if (response[ 'status' ] == 1) { window.location.href = "{{ url('list') }}" ; } else { if (response[ 'errors' ][ 'name' ]) { $( "#name" ).addClass( 'is-invalid' ); $( "#name-error" ).html(response[ 'errors' ][ 'name' ]); } else { $( "#name" ).removeClass( 'is-invalid' ); $( "#name-error" ).html( "" ); } if (response[ 'errors' ][ 'email' ]) { $( "#email" ).addClass( 'is-invalid' ); $( "#email-error" ).html(response[ 'errors' ][ 'email' ]); } else { $( "#email" ).removeClass( 'is-invalid' ); $( "#email-error" ).html( "" ); } } } }); }) </script> </body> </html> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 | //resources/views/users/edit.blade.php <!DOCTYPE html> <html lang= "en" > <head> <meta charset= "UTF-8" > <meta name= "viewport" content= "width=device-width, initial-scale=1.0" > <meta http-equiv= "X-UA-Compatible" content= "ie=edge" > <title>Dynamic Dependent Dropdown</title> <link href= "https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel= "stylesheet" integrity= "sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin= "anonymous" > <meta name= "_token" content= "{{ csrf_token() }}" > </head> <body> <div class = "bg p-3 text-white shadow-lg text-center" > <h4>Laravel Dynamic Dependent Dropdown | Country State City | Jquery AJAX</h4> </div> <div class = "container mt-3" > <div class = "row d-flex justify-content-center" > <div class = "col-md-6" > <a href= "{{ url('/list') }}" class = "btn btn-primary mb-3" >Back</a> <div class = "card card-primary p-4 border-0 shadow-lg" > <form action= "" id= "frm" name= "frm" method= "post" > <div class = "card-body" > <h3>Edit User</h3> <div class = "mb-3" > <input type= "text" class = "form-control-lg form-control" name= "name" id= "name" placeholder= "Enter Name" value= "{{ $user->name }}" > <p class = "invalid-feedback" id= "name-error" ></p> </div> <div class = "mb-3" > <input type= "text" class = "form-control-lg form-control" name= "email" id= "email" placeholder= "Enter Email" value= "{{ $user->email }}" > <p class = "invalid-feedback" id= "email-error" ></p> </div> <div class = "mb-3" > <select name= "country" id= "country" class = "form-control-lg form-select" > <option value= "" >Select Country</option> @ if (! empty ( $countries )) @ foreach ( $countries as $country ) <option {{ ( $user ->country == $country ->id) ? 'selected' : '' }} value= "{{ $country->id }}" >{{ $country ->name }}</option> @ endforeach @ endif </select> </div> <div class = "mb-3" > <select name= "state" id= "state" class = "form-control-lg form-select" > <option value= "" >Select State</option> @ if (! empty ( $states )) @ foreach ( $states as $state ) <option {{ ( $user ->state == $state ->id) ? 'selected' : '' }} value= "{{ $state->id }}" >{{ $state ->name }}</option> @ endforeach @ endif </select> </div> <div class = "mb-3" > <select name= "city" id= "city" class = "form-control-lg form-select" > <option value= "" >Select City</option> @ if (! empty ( $cities )) @ foreach ( $cities as $city ) <option {{ ( $user ->city == $city ->id) ? 'selected' : '' }} value= "{{ $city->id }}" >{{ $city ->name }}</option> @ endforeach @ endif </select> </div> <div class = "d-grid" > <button class = "btn btn-primary btn-lg" >Update</button> </div> </div> </form> </div> </div> </div> </div> <script src= "https://code.jquery.com/jquery-3.7.1.min.js" ></script> <!--https://blog.jquery.com/2023/08/28/jquery-3-7-1-released-reliable-table-row-dimensions/ https://getbootstrap.com/ --> <script src= "https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity= "sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin= "anonymous" ></script> <script> $.ajaxSetup({ headers: { 'X-CSRF-TOKEN' : $( 'meta[name="_token"]' ).attr( 'content' ) } }); $(document).ready( function () { $( "#country" ).change( function () { var country_id = $(this).val(); if (country_id == "" ) { var country_id = 0; } $.ajax({ url: '{{ url("/fetch-states/") }}/' + country_id, type: 'post' , dataType: 'json' , success: function (response) { $( '#state' ).find( 'option:not(:first)' ).remove(); $( '#city' ).find( 'option:not(:first)' ).remove(); if (response[ 'states' ].length > 0) { $.each(response[ 'states' ], function (key, value) { $( "#state" ).append( "<option value='" + value['id '] + "' >" + value[ 'name' ] + "</option>" ) }); } } }); }); $( "#state" ).change( function () { var state_id = $(this).val(); console.log(state_id); if (state_id == "" ) { var state_id = 0; } $.ajax({ url: '{{ url("/fetch-cities/") }}/' + state_id, type: 'post' , dataType: 'json' , success: function (response) { $( '#city' ).find( 'option:not(:first)' ).remove(); if (response[ 'cities' ].length > 0) { $.each(response[ 'cities' ], function (key, value) { $( "#city" ).append( "<option value='" + value['id '] + "' >" + value[ 'name' ] + "</option>" ) }); } } }); }); }); $( "#frm" ).submit( function (event) { event.preventDefault(); $.ajax({ url: '{{ url("/edit/".$user->id) }}' , type: 'post' , data: $( "#frm" ).serializeArray(), dataType: 'json' , success: function (response) { if (response[ 'status' ] == 1) { window.location.href = "{{ url('list') }}" ; } else { if (response[ 'errors' ][ 'name' ]) { $( "#name" ).addClass( 'is-invalid' ); $( "#name-error" ).html(response[ 'errors' ][ 'name' ]); } else { $( "#name" ).removeClass( 'is-invalid' ); $( "#name-error" ).html( "" ); } if (response[ 'errors' ][ 'email' ]) { $( "#email" ).addClass( 'is-invalid' ); $( "#email-error" ).html(response[ 'errors' ][ 'email' ]); } else { $( "#email" ).removeClass( 'is-invalid' ); $( "#email-error" ).html( "" ); } } } }); }) </script> </body> </html> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | //resources/views/users/list.blade.php <!DOCTYPE html> <html lang= "en" > <head> <meta charset= "UTF-8" > <meta name= "viewport" content= "width=device-width, initial-scale=1.0" > <meta http-equiv= "X-UA-Compatible" content= "ie=edge" > <title>Dynamic Dependent Dropdown</title> <link href= "https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel= "stylesheet" integrity= "sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin= "anonymous" > <meta name= "_token" content= "{{ csrf_token() }}" > </head> <body> <div class = "bg p-3 text-white shadow-lg text-center" > <h4>Laravel Dynamic Dependent Dropdown | Country State City | Jquery AJAX</h4> </div> <div class = "container mt-3" > <div class = "row d-flex justify-content-center" > <div class = "col-md-6" > <a href= "{{ url('/create') }}" class = "btn btn-primary mb-3" >Create</a> <div class = "card card-primary p-4 border-0 shadow-lg" > @ if (Session::has( 'success' )) <div class = "alert alert-success" > {{ Session::get( 'success' ) }} </div> @ endif @ if (Session::has( 'error' )) <div class = "alert alert-danger" > {{ Session::get( 'error' ) }} </div> @ endif <div class = "card-body" > <h3>Users</h3> <table class = "table" > <thead> <tr> <th>ID</th> <th>Name</th> <th>Email</th> <th>Edit</th> </tr> @ if (! empty ( $users )) @ foreach ( $users as $user ) <tr> <td>{{ $user ->id }}</td> <td>{{ $user ->name }}</td> <td>{{ $user ->email }}</td> <td> <a href= "{{ url('edit/'.$user->id) }}" class = "btn btn-success" >Edit</a> </td> </tr> @ endforeach @ endif </thead> </table> </div> </div> </div> </div> </div> <script src= "https://code.jquery.com/jquery-3.7.1.min.js" ></script> <!--https://blog.jquery.com/2023/08/28/jquery-3-7-1-released-reliable-table-row-dimensions/ https://getbootstrap.com/ --> <script src= "https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity= "sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin= "anonymous" ></script> </body> </html> |
Starting Laravel development server: http://127.0.0.1:8000