Laravel crud – Build Your First CRUD App

Laravel CRUD – CRUD is the basic requirement of the any project. In this tutorial we will learn CRUD operation with server-side form validation. You will learn easy to insert update delete operation with laravel Applications from scratch.

We will create crud (create/read/update/delete) for product management. We will validate crud application forms with server-side validation. In this product crud management, we will use the resource controller and route.

Laravel Crud Tutorial

Contents

  • Install Laravel Fresh Project
  • Generate Model and Migration
  • Create Resource Route & Controller
  • Create the blade view
  • Start Development Server
  • Conclusion

Install Laravel Fresh Project

We need to install laravel 6 fresh application using below command, Open your command prompt and run the below command :

composer create-project --prefer-dist laravel/laravel Blog

After successfully install laravel 6 Application, Go to your project root directory and find the .env file and setup database credential, If you don’t find the .env file then rename the .env.example file to .env

Configuration in .env

In this step, we will set database credential in .env file. Let’s open .env file.

 
DB_CONNECTION=mysql 
DB_HOST=127.0.0.1 
DB_PORT=3306 
DB_DATABASE=here your database name here
DB_USERNAME=here database username here
DB_PASSWORD=here database password here

 Generate Model and Migration

Now we will create table named Products and its migration file. use the below command:

php artisan make:model Product -m

This command will create a model named Products and also create one migration file for Product table. After successfully run the command go to database/migrations file and put the below here :

 
<?php 
  
use Illuminate\Support\Facades\Schema; 
use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 
   
class CreateProductsTable extends Migration 
{ 
    /** 
     * Run the migrations. 
     * 
     * @return void 
     */ 
    public function up() 
    { 
        Schema::create('products', function (Blueprint $table) { 
            $table->bigIncrements('id'); 
            $table->string('title'); 
            $table->string('product_code'); 
            $table->text('description'); 
            $table->timestamps(); 
        }); 
    } 
   
    /** 
     * Reverse the migrations. 
     * 
     * @return void 
     */ 
    public function down() 
    { 
        Schema::dropIfExists('products'); 
    } 
} 

Next, migrate the table using the below command.

php artisan migrate

If you found any query builder error in command prompt go to  => app\Providers\AppServiceProvider.php and put the below code here :

 use Illuminate\Support\Facades\Schema;
 
public function boot()
{
    Schema::defaultStringLength(191);
}

And then run this below command :

 php artisan migrate:fresh

Now, add the fillable property inside Book.php file.

<?php
 namespace App;
 use Illuminate\Database\Eloquent\Model;
 class Product extends Model
 {
     protected $fillable = [
     'title',
     'product_code',
     'description'
    ];
 }

Create Resource Route & Controller

Create the ProductController using the below command.

php artisan make:controller ProductController  --resource

This command will create a contoller name ProductController and also inside by default seven methods like index, store, create, update, destroy, show, edit.

Next, We need to add the resource route. Go to routes/web.php put the below routes here :

<?php 

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

Route::resource('products', 'ProductController');

Next open controller, Go to app/HTTP/Controller/ProductController and put the below code here :

<?php
  
namespace App\Http\Controllers;
  
use App\Product;
use Illuminate\Http\Request;
use Redirect;
use PDF;
  
class ProductController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $data['products'] = Product::orderBy('id','desc')->paginate(10);
  
        return view('product.list',$data);
    }
   
    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view('product.create');
    }
  
    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $request->validate([
            'title' => 'required',
            'product_code' => 'required',
            'description' => 'required',
        ]);
  
        Product::create($request->all());
   
        return Redirect::to('products')
       ->with('success','Greate! Product created successfully.');
    }
   
    /**
     * Display the specified resource.
     *
     * @param  \App\Product  $product
     * @return \Illuminate\Http\Response
     */
    public function show(Request $request)
    {
        
    }
   
    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Product  $product
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {   
        $where = array('id' => $id);
        $data['product_info'] = Product::where($where)->first();

        return view('product.edit', $data);
    }
  
    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Product  $product
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $request->validate([
            'title' => 'required',
            'product_code' => 'required',
            'description' => 'required',
        ]);
        
        $update = ['title' => $request->title, 'description' => $request->description];
        Product::where('id',$id)->update($update);
  
        return Redirect::to('products')
       ->with('success','Great! Product updated successfully');
    }
  
    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Product  $product
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        Product::where('id',$id)->delete();
  
        return Redirect::to('products')->with('success','Product deleted successfully');
    }
    
}

Create the blade view

Next, We need to create some blade view files, Go to app/resources/views/ and create one folder name product. Inside the product folder create the following blade files.

  1. Layout.blade.php
  2. List.blade.php
  3. Create.blade.php
  4. Edit.blade.php
Layout.blade.php
<!DOCTYPE html>
<html>
  <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">
    <meta name="csrf-token" content="{{ csrf_token() }}">
    <title>Laravel CRUD Tutorial With Example - w3path.com</title>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css" />
  </head>
  <body>
    <div class="container">
      @yield('content')
    </div>
  </body>
</html>
List.blade.php
@extends('product.layout')
  
@section('content')
 <div class="row">
  <div class="col-sm-6">
    <h4>Product List</h4>
  </div>
  <div class="col-sm-6 text-right">
    <a href="{{ route('products.create') }}" class="btn btn-success mb-2">Add</a> 
  </div>
</div>

 <div class="row">
      <div class="col-12">          
        <table class="table table-bordered" id="laravel_crud">
         <thead>
            <tr>
               <th>Id</th>
               <th>Title</th>
               <th>Product Code</th>
               <th>Description</th>
               <th>Created at</th>
               <th colspan="2" class="text-center">Action</th>
            </tr>
         </thead>
         <tbody>
            @foreach($products as $product)
            <tr>
               <td>{{ $product->id }}</td>
               <td>{{ $product->title }}</td>
               <td>{{ $product->product_code }}</td>
               <td>{{ $product->description }}</td>
               <td>{{ date('Y-m-d', strtotime($product->created_at)) }}</td>
               <td class="text-center">
                <a href="{{ route('products.edit',$product->id)}}" class="btn btn-primary">Edit</a></td>
               <td class="text-center">
               <form action="{{ route('products.destroy', $product->id)}}" method="post">
                {{ csrf_field() }}
                @method('DELETE')
                <button class="btn btn-danger" type="submit">Delete</button>
              </form>
              </td>
            </tr>
            @endforeach

            @if(count($products) < 1)
              <tr>
               <td colspan="10" class="text-center">There are no product available yet!</td>
              </td>
            </tr>
            @endif
         </tbody>
        </table>
        {!! $products->links() !!}
     </div> 
 </div>
 @endsection  
Create.blade.php
@extends('product.layout')

@section('content')
<div class="row">
    <div class="col-sm-6">
        <h4>Add Product</h4>
    </div>
    <div class="col-sm-6 text-right">
        <a href="{{ route('products.index') }}" class="btn btn-danger mb-2">Go Back</a> 
    </div>    
</div>
<hr />

<form action="{{ route('products.store') }}" method="POST" name="add_product">
    {{ csrf_field() }}
     
    <div class="row">
        <div class="col-md-12">
            <div class="form-group">
                <strong>Title</strong>
                <input type="text" name="title" class="form-control" placeholder="Enter Title">
                <span class="text-danger">{{ $errors->first('title') }}</span>
            </div>
        </div>
        <div class="col-md-12">
            <div class="form-group">
                <strong>Product Code</strong>
                <input type="text" name="product_code" class="form-control" placeholder="Enter Product Code">
                <span class="text-danger">{{ $errors->first('product_code') }}</span>
            </div>
        </div>
        <div class="col-md-12">
            <div class="form-group">
                <strong>Description</strong>
                <textarea class="form-control" col="4" name="description" placeholder="Enter Description"></textarea>
                <span class="text-danger">{{ $errors->first('description') }}</span>
            </div>
        </div>
        <div class="col-md-12">
            <button type="submit" class="btn btn-primary">Submit</button>
            <a href="{{ route('products.index') }}" class="btn btn-danger">Cancel</a> 
        </div>
    </div>     
</form>
@endsection
Edit.blade.php
@extends('product.layout')

@section('content')

<div class="row">
  <div class="col-sm-6">
    <h4>Edit Product</h4>
  </div>
  <div class="col-sm-6 text-right">
    <a href="{{ route('products.index') }}" class="btn btn-danger mb-2">Go Back</a> 
  </div>    
</div>
<hr />
 
<form action="{{ route('products.update', $product_info->id) }}" method="POST" name="update_product">
  {{ csrf_field() }}
  @method('PATCH')
   
  <div class="row">
      <div class="col-md-12">
          <div class="form-group">
              <strong>Title</strong>
              <input type="text" name="title" class="form-control" placeholder="Enter Title" value="{{ $product_info->title }}">
              <span class="text-danger">{{ $errors->first('title') }}</span>
          </div>
      </div>
      <div class="col-md-12">
          <div class="form-group">
              <strong>Product Code</strong>
              <input type="text" name="product_code" class="form-control" placeholder="Enter Product Code" value="{{ $product_info->product_code }}">
              <span class="text-danger">{{ $errors->first('product_code') }}</span>
          </div>
      </div>
      <div class="col-md-12">
          <div class="form-group">
              <strong>Description</strong>
              <textarea class="form-control" col="4" name="description" placeholder="Enter Description" >{{ $product_info->description }}</textarea>
              <span class="text-danger">{{ $errors->first('description') }}</span>
          </div>
      </div>
      <div class="col-md-12">
          <button type="submit" class="btn btn-primary">Submit</button>
          <a href="{{ route('products.index') }}" class="btn btn-danger">Cancel</a> 
      </div>
  </div>
   
</form>
@endsection

Start Development Server

In this step, we will use the PHP artisan serve command. It will start your server locally

php artisan serve

If you want to run the project diffrent port so use this below command

php artisan serve --port=8080

Now we are ready to run our example open the below URL in the browser.

http://localhost:8000/products

Conclusion

In this article, We have successfully created laravel 6 CRUD Application (Create, Read, Update, Delete) with example. Our examples run quickly.

If you have found this article useful, share this article with your friends and leave comment if you have any question or thoughts. Your responses are highly appreciated.

28 Comments

  1. sua dieu hoa uy tin tai ha noi said:

    Báo cáo Quý khách hàng nghiệm thu và thanh toán.

    September 24, 2019
    Reply
  2. sirgliofrei said:

    I would like to thank you for the efforts you have put in writing this site. I’m hoping the same high-grade website post from you in the upcoming as well. In fact your creative writing skills has encouraged me to get my own blog now. Really the blogging is spreading its wings rapidly. Your write up is a great example of it.

    October 11, 2019
    Reply
  3. uche said:

    great way to create my first crud app, but is there a way I could send the table data via email. hope to get a reply from you.Thanks

    December 10, 2019
    Reply
  4. Kimpu said:

    Really Great Posts.God bless you more Bro.

    January 11, 2020
    Reply
  5. Tola said:

    Wow, So good Laravel Crud Tutorial

    March 9, 2020
    Reply
  6. Lissa Frankie said:

    My friend first found your blog on Google and she referred your blog to me.”`;,-

    October 7, 2020
    Reply
  7. dial now said:

    Incredibly educational, look frontward to coming back.

    November 19, 2020
    Reply
  8. href=”https://www.google.ca/url?q=https://seksicam.com”>undefined said:
    November 20, 2020
    Reply
  9. Graig said:

    Hey, I think your site might be having browser compatibility issues.
    When I look at your blog in Chrome, it looks fine
    but when opening in Internet Explorer, it has some overlapping.
    I just wanted to give you a quick heads up!

    Other then that, fantastic blog!

    Visit my web blog ketogenic diet for thyroid

    November 20, 2020
    Reply
  10. JamesFaurf said:

    САмое эффективное для продаж – Pinterest. Dbltj – Сотни Продаж на Etsy, amazon, ebay, shopify за 2 месяца при ср.цене чека 300 usd https://youtu.be/GNOZtXGGM-I

    November 26, 2020
    Reply
  11. WeluggBor said:

    Советуем вам подобрать угги из линейки UGG Australia. Бренд УГГ придумывает много новых вариантов уггов. Большинство моделек шьются на зиму, но есть некоторые на осень и весну. Если вы интересуетесь как приобрести сапоги из натуральных материалов, к тому же, где прочный материал, вам надо посмотреть на australia-msk.ru, где есть мужские и женские UGG Australia.

    В эти дни на ресурсе проходят скидки на предыдущую коллекцию. Можно подобрать UGG 2020 года по 50% скидке. Выбрать вы можете разного цвета модели: тёмные, рыжые и даже тёмно-бордовые. Внутри уггов есть прочный задник, который стойкий и упругий. Также, он плотный и в мужских и женских уггах можно комфортно ходить по снегу.

    Многие ребята задумываются о заказе уггов с первым снегом. Чтобы носить высококачественную обувь, вам надо обратить внимание на разные модели австралийской обуви, в составе которых материал из живой австралийской овцы. Все варианты уггов идеально подойдут для повседневной жизни.

    Зимой в них в кайф ехать в общественном транспорте или машине. Нога в них не будет преть или потеть. Основная причина – инновационная технология подачи воздуха. Осенью ножки будут чувствовать себя хорошо, ведь циркулирует воздух внутри ботинка по всему периметру.

    Официальный сайт UGG Australia в России разработал пару категорий. Можно найти мужские и женские UGG классические, модели mini и даже с мини замком. В настоящем году очень ценятся кое-какие угги на липучке.

    Также, если раньше угги покупали исключительно жены, то в 2020 году спрос на них и у парней. Среди мужских позиций особо популярна MENS CLASSIC SHORT GREY, а также MENS CLASSIC SHORT BOMBER СHЕSTNUT.

    Симпатичные угги будут хорошо смотреться как в студенческой аудитории, так и в офисе. Подобрать их реально на australia-msk.ru где хватает разных вариантов. Основной плюс австралийских уггов в том, что их мех на самом деле греет и это не просто обман. Человек может легко найти отличную модель, которая понравится вам и в которую вы влюбитесь. Сейчас за разными ботиночками активно гоняются мужчины, чтобы сделать презент своей любимой жене.

    Если вы интересуетесь как заказать UGG Australia, но не знаете, какие оптимально выбрать для женщины, вам лучше обратить внимание на коллекцию LUX. Подобные угги универсальные и будут великолепно смотреться. К примеру, UGG WOMEN’S CHRISTIAN DIOR GREY сегодня действительно популярна. Если вы задумались задать какой-то вопрос, бегло звоните по телефону +74957489547 или отправляйтесь по адресу Москва, Проспект мира, д. 102, к.1. В компании вам помогут с выбором и посоветуют лучший вариант!

    November 27, 2020
    Reply
  12. Stephenevips said:

    Бездепозитные бонусы и фриспины за регистрацию в 2020 году – это довольно заманчивые предложение от онлайн-казино. Получить бесплатные бонусы в подарок можно на сайте – https://777.vulkan-kazino.top Не упускайте свой шанс на удачную игру с бонусом без депозита!

    November 27, 2020
    Reply
  13. Rank first page in bing said:

    Pretty section of content. I just stumbled upon your blog and in accession capital to assert that I get in fact enjoyed account your blog posts. Any way I will be subscribing to your augment and even I achievement you access consistently fast.

    November 28, 2020
    Reply
  14. LarryHouff said:

    Мы собрали для вас список казино с бонусом за регистрацию без депозита в 2021 году. <https://all.casino-profit.pro/nodep-bonuses.html Данный тип бонуса позволит начать играть в онлайн казино без риска потерять деньги

    November 28, 2020
    Reply
  15. NornTent said:

    The cleansing company performs cleansing of areas of numerous sizes as well as setups.

    We offer specialist molly maid for personal customers. Using European tools as well as licensed devices, we attain optimal results and also provide cleansing quickly.

    The firm’s experts offer cleaning up with the help of contemporary innovations, have unique equipment, and also have certified cleaning agents in their toolbox. Along with the above benefits, glass of wines use: positive rates; cleansing in a short time; premium quality outcomes; more than 100 favorable testimonials. Cleansing offices will assist maintain your work environment in order for the most efficient job. Any kind of business is extremely important ambience in the group. Cleaning services that can be purchased cheaply now can help to organize it and offer a comfy space for labor.

    If essential, we leave cleansing the kitchen area 2-3 hrs after placing the order. You get cleaning up asap.

    We provide price cuts for those that utilize the solution for the very first time, in addition to beneficial regards to collaboration for regular consumers.

    We give high-quality cleansing for huge business and also tiny companies of numerous directions, with a discount of approximately 25%.

    Our pleasant team provides you to obtain accustomed with favorable regards to teamwork for company clients. We responsibly approach our activities, tidy utilizing expert cleaning products as well as specialized devices. Our employees are trained, have medical books as well as recognize with the subtleties of getting rid of complicated and hard-to-remove dirt from surface areas.

    November 28, 2020
    Reply
  16. Maybelle said:

    Wow, amazing blog layout! How long have you been blogging for?
    you make blogging look easy. The overall look of your website is wonderful, as well as the
    content!

    Take a look at my blog – укрпозика коллектор

    November 29, 2020
    Reply
  17. Glenntomma said:

    Допустим, вы хозяин нового сайта, который имеет приятный современный дизайн, удобную навигацию и полезную для покупателей информацию. Но участников нет. Что делать? Если у вас есть собственный бизнес мы поможем вам создать веб страницу. Отмечено что, ни одно реальное или виртуальное предприятие не может продвигаться само по себе. Отдельной фирме нужна подспорье в приобретении популярности, а во Мировой компьюторной сети без нее безусловно не быть из-за бурной конкуренции.Мы занимаемся разработкой продающегося сайта. Наши сотрудники готовы запустить полноценный портал в течение шести дней. Кроме выдачи полных сайтов, мы осуществляем перечень работ тех. помощи: своевременное продление хостинга и вашего домена, добавление контента на веб-сайт, размещения известий. Наши услуги дадут возможность вам стать лидером на необъятных просторах интернета.

    продвижение сайта на английском

    November 29, 2020
    Reply
  18. WilliamDut said:

    секс с мамой на русском языке, размещенные на нашем ресурсе, настолько прекрасны, что выбор будет сделать совсем не просто, но выбрав самую развратную красотку-путану, она воплотит в реальность самые смелые сексуальные фантазии.

    November 30, 2020
    Reply
  19. Aida said:

    Wow! Finally I got a website from where I know how to genuinely get useful data
    regarding my study and knowledge.

    my website :: cong ty moneyveo vi?t nam

    November 30, 2020
    Reply
  20. Royal said:

    먹튀사이트 검증사이트 먹튀폴리스입니다.
    먹튀폴리스는 신규는 물론 오픈된 먹튀사이트를 철저히 먹튀검증하여 먹튀없는 시대를
    만들어가고 있습니다. 먹튀폴리스를 사랑하는 여러분의
    많은 호응바랍니다. 여러분의 충실한 먹튀검증 사이트가 되도록 노력하겠습니다.

    November 30, 2020
    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *