Country and State table with Insert Operation in Database in Laravel 11

 <?php


namespace App\Http\Controllers;

use App\Models\Country;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class CountryController extends Controller
{
    public function index()
    {
        $country = DB::table("country")->get();
        return view("country", ["data" => $country]);
    }

    public function showCountry()
    {
        $country = DB::table("country")->get();
        return view("countryHome", ["data" => $country]);
    }

    public function validateCountry(Request $request)
    {
        if ($request->validate([
            "countryName" => "required",
            "countryCode" => "required|unique:country,country_code",
            "countryDial" => "required|numeric|unique:country,country_dial"
        ])) {
            $country = Country::insert([
                "country_name" => $request->countryName,
                "country_code" => $request->countryCode,
                "country_dial" => $request->countryDial,
                "created_at" => now(),  //now() is a helper function in laravel
                "updated_at" => now()
            ]);
            if ($country) {
                $country = DB::table("country")->get();
                return view("countryHome", ["data" => $country]);
            }
            return redirect()->route("showCountry.country");
        } else {
            return redirect()->route("country");
        }
    }
}
Above File is app\Http\Controllers\CountryController.php File





Below File is app\Http\Controllers\StatesController.php File
<?php

namespace App\Http\Controllers;

use App\Models\States;
use Illuminate\Contracts\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

class StatesController extends Controller
{
    public function index(Request $request)
    {
        $country = DB::table("country")->get();
        return view("states", ["data" => $country]);
    }

    public function showStates()
    {
        $states = DB::table("states")->get();
        return view("statesHome", ["data" => $states]);
    }

    public function validateStates(Request $request)
    {
        if ($request->validate([
            "country" => "required",
            "state" => [
                'required',
                'string',
                'max:255',
                // Ensure the combination of state name and country_id is unique
                Rule::unique('states', 'state_name')->where(function ($query) use ($request) {
                    return $query->where('country_ID', $request->country);
                }),
            ],
            "status" => "required"
        ], [
            'state.unique' => 'The state name already exists for the selected country.',
        ])) {
            $states = States::insert([
                "country_ID" => $request->country,
                "state_name" => $request->state,
                "status" => $request->status,
                "created_at" => now(),
                "updated_at" => now()
            ]);
            if ($states) {
                $states = DB::table("states")->get();
                return view("statesHome", ["data" => $states]);
            }
            return redirect()->route("showStates.states");
        } else {
            return redirect()->route("states");
        }
    }
}





Below File is app\Models\Country.php File
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Country extends Model
{
    use HasFactory;
    protected $table = "country";
    protected $primarykey = "id";
    protected $fillable = [
        "country_name",
        "country_code",
        "country_dial_code"
    ];
}





Below File is app\Models\States.php File
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class States extends Model
{
    use HasFactory;
    protected $table = "states";
    protected $primarykey = "id";
    protected $foreignkey = "country_ID";
    protected $fillable = [
        "country_ID",
        "state_name",
        "status"
    ];
}





Below File is database\migrations\2024_11_25_050822_create_country_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(): void
    {
        Schema::create('country', function (Blueprint $table) {
            $table->id();
            $table->string("country_name", 50);
            $table->string("country_code");
            $table->string("country_dial");
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('country');
    }
};





Below File is database\migrations\2024_11_25_053636_create_states_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(): void
    {
        // Here below, we have used "cascade" that means if we change anything in primary key table then it will automatically update in Foreign key table
        Schema::create('states', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger("country_ID");
            $table->foreign("country_ID")->references("id")->on("country")->onUpdate("cascade")->onDelete("cascade")->onDelete("set null");
            $table->string("state_name", 50);
            $table->boolean("status");
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('states');
    }
};






Below File is resources\views\country.blade.php File
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Country</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">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js" integrity="sha384-I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.min.js" integrity="sha384-0pUGZvbkm6XF6gxjEnlmuGrJXVbNuzT9qBBavbLwCsOGabYfZo0T0to5eqruptLy" crossorigin="anonymous"></script>
</head>
<body>
    <div class="container mt-5">
        <div class="row justify-content-center">
            <div class="col-4 card">
                <div class="card-header">
                    <h1 class="mb-5 card-title">Add Country Details</h1>
                </div>
                <div class="card-body">
                    <form action="{{ route("validateCountry.country") }}" method="POST">
                        @csrf
                        <div class="mb-3">
                            <label for="exampleInputCountryName" class="form-label">Country Name</label>
                            <input type="text" class="form-control @error("countryName") is-invalid @enderror" id="exampleInputCountryName" aria-describedby="countryHelp" name="countryName">
                            @if($errors->has("countryName"))
                                <div class="error">{{ $errors->first("countryName") }}</div>
                            @endif
                        </div>
                        <div class="mb-3">
                            <label for="exampleInputCountryCode" class="form-label">Country ISO Code</label>
                            <input type="text" class="form-control @error("countryCode") is-invalid @enderror" id="exampleInputCountryCode" name="countryCode">
                            @if($errors->has("countryCode"))
                                <div class="error">{{ $errors->first("countryCode") }}</div>
                            @endif
                        </div>
                        <div class="mb-3">
                            <label for="exampleInputCountryDial" class="form-label">Country Dial</label>
                            <input type="text" class="form-control @error("countryDial") is-invalid @enderror" id="exampleInputCountryDial" name="countryDial">
                            @if($errors->has("countryDial"))
                                <div class="error">{{ $errors->first("countryDial") }}</div>
                            @endif
                        </div>
                        <button class="btn btn-primary mt-3">Submit</button>
                        <a href="{{ route("showCountry.country") }}" class="btn btn-primary mt-3">Go to Home</a>
                    </form>
                </div>
            </div>
        </div>
    </div>
</body>
</html>





Below File is resources\views\countryHome.blade.php File
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Home Screen</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">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js" integrity="sha384-I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.min.js" integrity="sha384-0pUGZvbkm6XF6gxjEnlmuGrJXVbNuzT9qBBavbLwCsOGabYfZo0T0to5eqruptLy" crossorigin="anonymous"></script>
</head>
<body>
    <div class="container">
        <div class="row">
            <div class="col-10">
                <a href="{{ route("country") }}" class="btn btn-primary mt-5 mb-5">Add New Country</a>
                <table class="table table-bordered table-striped table-hover">
                    <thead>
                        <tr>
                            <th>ID</th>
                            <th>Country Name</th>
                            <th>Country Code</th>
                            <th>Country Dial</th>
                            <th>Created At</th>
                            <th>Updated At</th>
                        </tr>
                    </thead>
                    <tbody>
                        @foreach($data as $key => $value)
                        <tr>
                            <td>{{ $value->id }}</td>
                            <td>{{ $value->country_name }}</td>
                            <td>{{ $value->country_code }}</td>
                            <td>{{ $value->country_dial }}</td>
                            <td>{{ $value->created_at }}</td>
                            <td>{{ $value->updated_at }}</td>
                        </tr>
                        @endforeach
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</body>
</html>





Below File is resources\views\states.blade.php File
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>States</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">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js" integrity="sha384-I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.min.js" integrity="sha384-0pUGZvbkm6XF6gxjEnlmuGrJXVbNuzT9qBBavbLwCsOGabYfZo0T0to5eqruptLy" crossorigin="anonymous"></script>
    <script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
</head>
<body>
    <div class="container mt-5">
        <div class="row justify-content-center">
            <div class="col-4 card">
                <div class="card-header">
                    <h1 class="mb-5 card-title">Add State Details</h1>
                </div>
                <div class="card-body">
                    <form action="{{ route("validateStates.states") }}" method="POST">
                        @csrf
                        <div class="mb-3">
                            <label for="exampleInputStateName" class="form-label">Enter State : </label>
                            <input type="text" class="form-control @error("state") is-invalid @enderror" id="exampleInputStateName" aria-describedby="countryHelp" name="state">
                            @if($errors->has("state"))
                                <div class="error">{{ $errors->first("state") }}</div>
                            @endif
                        </div><br>
                        <div class="mb-3">
                            <label for="state">Choose Country name : </label>
                            <select name="country" id="country" name="country">
                                @foreach($data as $key => $value)
                                    <option value={{ $value->id }}>{{ $value->country_name }}</option>
                                @endforeach
                            </select>
                            @if($errors->has("country"))
                                <div class="error">{{ $errors->first("country") }}</div>
                            @endif
                        </div><br>
                       
                        <p>Please select status : </p>
                        <input type="radio" id="active" name="status" value="1">
                        <label for="active">Active</label><br><br>
                        <input type="radio" id="inactive" name="status" value="0">
                        <label for="inactive">Inactive</label><br>
                        @if($errors->has("status"))
                            <div class="error">{{ $errors->first("status") }}</div>
                        @endif
                        <br><br>
                        <button type="submit" class="btn btn-primary">Submit</button>
                        <a href="{{ route("showStates.states") }}" class="btn btn-primary">Go to Home</a>
                    </form>
                </div>
            </div>
        </div>
    </div>

    {{-- <script>
        $(document).ready(function(){
            $("#country").change(function(){
                var id = this.value;
                $("#exampleCountryID").val(id);
                // alert(id);
                // $.ajax({
                //     url: "http://127.0.0.1:8000/states",
                //     type: "POST",
                //     dataType: "json",
                //     data: {country_id: id},
                //     success: function(result){
                //         if(result) {
                //             alert("Correct");
                //         }
                //     },
                //     error: function(result){
                //         if(result) {
                //             alert("Incorrect");
                //         }
                //     }
                // });
            });
        });
    </script> --}}
</body>
</html>





Below File is resources\views\statesHome.blade.php File
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Home Screen</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">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js" integrity="sha384-I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.min.js" integrity="sha384-0pUGZvbkm6XF6gxjEnlmuGrJXVbNuzT9qBBavbLwCsOGabYfZo0T0to5eqruptLy" crossorigin="anonymous"></script>
</head>
<body>
    <div class="container">
        <div class="row">
            <div class="col-10">
                <a href="{{ route("states") }}" class="btn btn-primary mt-5 mb-5">Add New State</a>
                <table class="table table-bordered table-striped table-hover">
                    <thead>
                        <tr>
                            <td>ID</td>
                            <td>Country ID</td>
                            <td>Country Name</td>
                            <td>Status</td>
                            <td>Created At</td>
                            <td>Updated At</td>
                        </tr>
                    </thead>
                    <tbody>
                        @foreach($data as $key => $value)
                            <tr>
                                <td>{{ $value->id }}</td>
                                <td>{{ $value->country_ID }}</td>
                                <td>{{ $value->state_name }}</td>
                                <td>{{ $value->status }}</td>
                                <td>{{ $value->created_at }}</td>
                                <td>{{ $value->updated_at }}</td>
                            </tr>
                        @endforeach
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</body>
</html>





Below File is routes\web.php File
<?php

use App\Http\Controllers\CountryController;
use App\Http\Controllers\NotificationController;
use App\Http\Controllers\StatesController;
use App\Http\Controllers\TaskController;
use App\Http\Controllers\TestController;
use App\Http\Controllers\UserController;
use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

Route::controller(NotificationController::class)->group(function () {
    Route::get("notification", "indexNotification");
    Route::get("notification/{type}", "notification")->name("notification");
    Route::get("notification_list", "index_notification");
    Route::get("notification_list/{type}", "notification_list")->name("notification_list");
});

Route::controller(TestController::class)->group(function () {
    Route::get("/index", "index");
    Route::get("/store-session", "storeSession");
    Route::get("/delete-session", "deleteSession");
});
Route::get("/welcomeTwoPage", function () {
    return view("welcomeTwo");
});

Route::get("/form", function () {
    return view("adduser");
})->name("adduser");
Route::post("/add", [UserController::class, "addUser"])->name("addUser");

Route::get("/showAllTasks", [TaskController::class, "showTask"])->name("home.task");
Route::post("/checkValidate", [TaskController::class, "validateUser"])->name("validate.user");

Route::get("/singleTask/{id}", [TaskController::class, "singleTask"])->name("single.task");

Route::get("/updatePage/{id}", [TaskController::class, "updatePage"])->name("update.page");
Route::put("/updateTask/{id}", [TaskController::class, "updateTask"])->name("update.task");

Route::get("/delete/{id}", [TaskController::class, "deleteTask"])->name("delete.task");

Route::controller(CountryController::class)->group(function () {
    Route::post("/validateCountry", "validateCountry")->name("validateCountry.country");
    Route::get("/countryHome", "showCountry")->name("showCountry.country");
    Route::get("/country","index")->name("country");
});

Route::controller(StatesController::class)->group(function () {
    Route::post("/validateStates", "validateStates")->name("validateStates.states");
    Route::get("/statesHome", "showStates")->name("showStates.states");
    Route::get("/states", "index")->name("states");
});

Route::get("/addNew", function () {
    return view("adduser");
})->name("addNew");




Comments

Popular posts from this blog

Eloquent Many to Many Relationship Tutorial in Laravel 11

Blade Template Tutorial Three Template Inheritance in Laravel 11