Back to all posts

CRUD APP – Using Laravel


Create a folder with name of your project. I created here as laravel-crud and open it in your code editor here i am using visual studio code.

Once your app is open in vs code open terminal and past this code

composer create-project laravel/laravel .

Here . indicate create project in ‘laravel-crud’ folder or root folder

After all code installed write.

php artisan serve

Now you have this Wellcome page


This is Laravel project file structure

In this routes folder web.php file contain different routes with respective view template is connected to that url

Let’s Create Our APP

At first we will create a form to register and login to our APP

So to do that we create routes for register login and logout routes


Route::post('/register',[UserController::class, 'register']);
Route::post('/logout',[UserController::class, 'logout']);
Route::post('/login',[UserController::class, 'login']);

Here UserController is a controller to write all code we can write all the login direct here but has our app gets bigger it hard to manage so we create controller for write all logic and functionality

How to create controller

php artisan serve make:controller UserController

This will create a file called UserController.php file inside app/Http/Controller/UserController.php file. At begging this file look like this

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    //
}

Now we create a database inside mysql and change our .env file.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravelcrud
DB_USERNAME=root
DB_PASSWORD=

After this we have get basic Laravel tables so we have to open our terminal and write this cmd.

php artisan migrate

This will generate all basic tables like failed_jobs, migrations, password_resets, personal_access_tokens, users

Now we create form for Register and login

<body>

    @auth
        <h3>Hello, Your are loged in.</h3>
        <form action="/logout" method="POST">
            @csrf
            <button>Log out</button>
        </form>
    @else
    <div class="border">
        <h2>Register</h2>
        <form action="/register" method="POST">
            @csrf
            <input type="text" name="name" placeholder="Name">
            <input type="email" name="email" placeholder="email">
            <input type="password" name="password" placeholder="password">
            <button>Register</button>
        </form>
    </div>
    <br>
    <div class="border">
        <h2>Login</h2>
        <form action="/login" method="POST">
            @csrf
            <input type="name" name="loginname" placeholder="name">
            <input type="password" name="loginpassword" placeholder="password">
            <button>Login</button>
        </form>
    </div>
    @endauth

  
</body>

I also added some basic style nothing fansy

        .border {
            border: 3px solid black;
            padding: 10px;
        }

After running this code our frontend will look like this

Now we write all functionality for these frontend code.

When user register user data will stored inside user table and when user login this will check user credentiala. For all these functionality we write code in UserController.php.

class UserController extends Controller
{

    /*
    Register function
    This will register user with name, email and password and store to users tables
    */
    public function register(Request $request)
    {

        $incomingFields = $request->validate([
            'name' => ['required', 'min:3', 'max:10', Rule::unique('users', 'name')],
            'email' => ['required', 'email', Rule::unique('users', 'email')],
            'password' => ['required', 'min:8', 'max:200'],
        ]);

        $incomingFields['password'] = bcrypt($incomingFields['password']);

        $user = User::create($incomingFields);

        auth()->login($user);

        return redirect('/');
    }

    
    /*
    Login function
    This will check for user and if there it login them
    */

    public function login(Request $request)
    {

        $incomingFields = $request->validate([
            'loginname' => 'required',
            'loginpassword' => 'required'
        ]);

        if (auth()->attempt(['name' => $incomingFields['loginname'], 'password' => $incomingFields['loginpassword']])) {
            $request->session()->regenerate();
        }

        return redirect('/');
    }

    
    /*
    Logout function
    This will logout user
    */

    public function logout()
    {
        auth()->logout();
        return redirect('/');
    }

}

All these code will give you register and login functionality

How to build CRUD Functionality

Now we build curd functionality with custom table.

In this crud app registered user have ability to add blog post, update and delete posts.

At first let’s create table for posts. In Laravel if you want to create table you have create migration file using this commond.

php artisan make:migration create_post_table

This will create a file inside database/migrations folder.

After that add all field you required in posts table inside up() function. That code look like this.

 /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
            $table->string('title');
            $table->longText('body');
            $table->foreignID('user_id')->constrained();

        });
    }

After adding all fields. run migration command.

php artisan migrate

This will create table and fields.

Now we build form for adding new post.

<div class="border">
    <h2>Create a new post</h2>
    <form action="/create-post" method="POST">
        @csrf
        <input type="text" name="title" placeholder="Post title">
        <textarea name="body"  cols="30" rows="10" placeholder="Body content..."></textarea>
        <button>Save Post</button>
    </form>
</div>

Now we write route for /create-post .

// web.php
 Route::post('/create-post', [PostController::class, 'createPost']);

For posts logic we can write it in UserController.php file but to stay organized we will create new controller called PostController

php artisan make:controller PostController

Now write logic for store post form data

    public function createPost(Request $request) {
        $incomingFields = $request->validate([
            'title' => 'required',
            'body' => 'required'
        ]);

        $incomingFields['title'] = strip_tags($incomingFields['title']);
        $incomingFields['body'] = strip_tags($incomingFields['body']);
        $incomingFields['user_id'] = auth()->id();
        Post::create($incomingFields);

        return redirect('/');

    }

If you observer here we used Post::create($incomingFields); So no we create Model

In Laravel model is nothing but  explain relationship with other models.

php artisan make:model Post

In Post model file We connect with controller to interact with view template

//Post.php
<?php

namespace App\Models;

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

class Post extends Model
{
    use HasFactory;
    // Extra Added Code.
    protected $fillable = ['title', 'body', 'user_id'];
    
    public function user() {
        return $this->belongsTo(User::class, 'user_id');
    }
}

Now we create route for view show Edit Screen page, edit(Update) and delete post.

 Route::get('/edit-post/{post}', [PostController::class, 'showEditScreen']);
 Route::put('/edit-post/{post}', [PostController::class, 'updatePost']);
 Route::delete('/delete-post/{post}', [PostController::class, 'deletePost']);

With these router we now can write edit view code.

//edit-post.blade.php
<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>Edit Post</title>
    <style>
        .border {
            border: 3px solid black;
            padding: 10px;
        }
    </style>
</head>

<body>
    <div class="border">
        <h2>Edit Post</h2>

        <form action="/edit-post/{{ $post->id }}" method="POST">
            @csrf
            @method('PUT')

            <input type="text" name="title" value="{{$post->title}}">
            <textarea name="body" cols="30" rows="10">{{$post->body}}</textarea>
            <button>Save Changes</button>
        </form>

    </div>
</body>

</html>

In this page we can update page.

Now we write logic for update post in Post Controller

//PostController.php
public function updatePost(Post $post, Request $request) {

        if(auth()->user()->id !== $post['user_id']) {
            return redirect('/');
        }

        $incomingFields = $request->validate([
            'title' => 'required',
            'body' => 'required'
        ]);

        
        $incomingFields['title'] = strip_tags($incomingFields['title']);
        $incomingFields['body'] = strip_tags($incomingFields['body']);

        $post->update($incomingFields);

        return redirect('/');

    }

This code will update post

Now we can write controller for delete post


//PostController.php    
public function deletePost(Post $post){

        if(auth()->user()->id === $post['user_id']) {
            $post->delete();
        }
        return redirect('/');

    }

For delete functionality to trigger we need to write some code inside home.blade.php

//home.blade.php
//rest of code
@foreach ($posts as $item)
    <div class="single-item">
        <h3>{{$item['title']}} </h3>
        <div>
            {{$item['body']}}    
        </div>    

        // This link will take to edit post page
        <p><a href="/edit-post/{{$item->id}}">Edit</a></p>
        // This will delete post
        <form action="/delete-post/{{$item->id}}" method="POST">
            @csrf
            @method('DELETE')
            <button>Delete</button>
        </form>
    </div>                            
@endforeach
//rest of the code.

With that code we complete our CRUD app now home.blade.php code look like this

//home.blade.php
<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>Laravel CRUD</title>

    <style>
        .border {
            border: 3px solid black;
            padding: 10px;
        }

        .single-item{
            background: rgb(207, 207, 207);
            padding: 10px;
            border-bottom: 5px solid lightgreen;
            margin-bottom: 10px;
        }
    </style>
</head>
<body>

    @auth
        <h3>Hello</h3>
        <form action="/logout" method="POST">
            @csrf
            <button>Log out</button>
        </form>

        <div class="border">
            <h2>Create a new post</h2>
            <form action="{{route('create-post')}}" method="POST">
                @csrf
                <input type="text" name="title" placeholder="Post title">
                <textarea name="body"  cols="30" rows="10" placeholder="Body content..."></textarea>
                <button>Save Post</button>
            </form>
        </div>

        <br>
        
        <div class="border">
            <h2>All Posts</h2>
            <hr>
@foreach ($posts as $item)
    <div class="single-item">
        <h3>{{$item['title']}} </h3>
        <div>
            {{$item['body']}}    
        </div>    

        <p><a href="/edit-post/{{$item->id}}">Edit</a></p>
        
        <form action="/delete-post/{{$item->id}}" method="POST">
            @csrf
            @method('DELETE')
            <button>Delete</button>
        </form>
    </div>                            
@endforeach
        </div>


    @else
    <div class="border">
        <h2>Register</h2>
        <form action="/register" method="POST">
            @csrf
            <input type="text" name="name" placeholder="Name">
            <input type="email" name="email" placeholder="email">
            <input type="password" name="password" placeholder="password">
            <button>Register</button>
        </form>
    </div>
    <br>
    Try <br>
    Username : chethan <br>
    Password: 12345678 
    <hr>
    Username: chethan2 <br>
    Password: 12345678
    <div class="border">
        <h2>Login</h2>
        <form action="/login" method="POST">
            @csrf
            <input type="name" name="loginname" placeholder="name">
            <input type="password" name="loginpassword" placeholder="password">
            <button>Login</button>
        </form>
    </div>
    @endauth

  
</body>
</html>

Download complete code here: https://drive.google.com/file/d/1fjYprs1U5Q7ZUilVG3ZWI5OPXGa9Z_DC/view?usp=sharing