Laravel 5.5 CRUD Tutorial

First of all, we will make one Laravel Project and then step by step; we will build this project. Ticket System is ultimately a Laravel 5.5 CRUD Operations, that is why my focus is on Laravel CRUD.

Step 1: Configure Laravel 5.5 Project.
Install the brand new Laravel Project by the typing following command.

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

Next, configure the database in the .env file.

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

php artisan make:migration CreateTicketsTable
 

File can be found in database/migrations/2018_07_17_150858_create_tickets_table
Okay, now we need to make one schema for the database.
Now, this is Ticket’s table schema.

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTicketsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tickets', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id');
            $table->string('title');
            $table->string('description');
            $table->timestamps();
        });
    }

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

If error comes then refer
https://laravel-news.com/laravel-5-4-key-too-long-error

Step 2: Laravel Authentication.

Laravel 5.5 Provides us Authentication out of the box. Just type the following command.

php artisan make:auth

Start the Laravel server by the following command.

php artisan serve

We can register the user by the following URL: http://localhost:8000/register

Step 3: Make models and controllers for our application.
We need to make TicketController.

Type the following cmd in the terminal.

php artisan make:controller TicketController

Also, make the models for the same. The User model is already there, so no need to create again.

php artisan make:model Ticket 

Step 4: Create the views for our application.

Make one user folder and in that make one file called create.blade.php.


@extends('layouts.app')
@section('content')
<div class="container">
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div><br />
@endif
<div class="row">
<form method="post" action="{{url('/create/ticket')}}">
<div class="form-group">
<input type="hidden" value="{{csrf_token()}}" name="_token" />
<label for="title">Ticket Title:</label>
<input type="text" class="form-control" name="title"/>
</div>
<div class="form-group">
<label for="description">Ticket Description:</label>
<textarea cols="5" rows="5" class="form-control" name="description"></textarea>
</div>
<button type="submit" class="btn btn-primary">Create</button>
</form>
</div>
</div>
@endsection

Now, make a route to get this file.

Route::get('/create/ticket','TicketController@create');

Also, write the controller get function.


/**
  * Show the form for creating a new resource.
  *
  * @return \Illuminate\Http\Response
  */
public function create()
{
   return view('user.create');
}

To store the data in a database, first, we need to prevent the mass assignment exception.

So, in the Ticket.php model, add the following attribute.

protected $fillable = ['user_id', 'title', 'description'];

Create one web route to handle the post request.

 

Route::post('/create/ticket','TicketController@store');

Include Ticket.php model into the TicketController.php file and write the store function code.

 


use App\Ticket;

/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$ticket = new Ticket();
$data = $this->validate($request, [
'description'=>'required',
'title'=> 'required'
]);

$ticket->saveTicket($data);
return redirect('/home')->with('success', 'New support ticket has been created! Wait sometime to get resolved');
}

Also, we have created the saveTicket() function into the model.

public function saveTicket($data)
{
$this->user_id = auth()->user()->id;
$this->title = $data['title'];
$this->description = $data['description'];
$this->save();
return 1;
}

Step 5: Display the tickets.
In the home.blade.php file, write the following code.


@extends('layouts.app')

@section('content')
<div class="container">
@if(\Session::has('success'))
<div class="alert alert-success">
{{\Session::get('success')}}
</div>
@endif

<div class="row">
<a href="{{url('/create/ticket')}}" class="btn btn-success">Create Ticket</a>
<a href="{{url('/tickets')}}" class="btn btn-default">All Tickets</a>
</div>
</div>
@endsection

Make one route for the listing of the tickets.

Route::get('/tickets', 'TicketController@index');


/**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $tickets = Ticket::where('user_id', auth()->user()->id)->get();
        
        return view('user.index',compact('tickets'));
    }

Create one index.blade.php file inside user folder.


@extends('layouts.app')

@section('content')
<div class="container">
<table class="table table-striped">
<thead>
<tr>
<td>ID</td>
<td>Title</td>
<td>Description</td>
<td colspan="2">Action</td>
</tr>
</thead>
<tbody>
@foreach($tickets as $ticket)
<tr>
<td>{{$ticket->id}}</td>
<td>{{$ticket->title}}</td>
<td>{{$ticket->description}}</td>
<td>Edit</td>
<td>Delete</td>
</tr>
@endforeach
</tbody>
</table>
<div>
@endsection

 

Step 6: Make edit view and write update function.


// web.php

Route::get('/edit/ticket/{id}','TicketController@edit');
Route::put('/edit/ticket/{id}','TicketController@update');

Switch to the controller and write the edit function.

/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
$ticket = Ticket::where('user_id', auth()->user()->id)
->where('id', $id)
->first();

return view('user.edit', compact('ticket', 'id'));
}

Write edit.blade.php file.

@extends('layouts.app')

@section('content')
<div class="container">
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div><br />
@endif
<div class="row">
<form method="post" action="{{action('TicketController@update', $id)}}" >
{{csrf_field()}}
<input name="_method" type="hidden" value="PATCH">
<div class="form-group">
<input type="hidden" value="{{csrf_token()}}" name="_token" />
<label for="title">Ticket Title:</label>
<input type="text" class="form-control" name="title" value={{$ticket->title}} />
</div>
<div class="form-group">
<label for="description">Ticket Description:</label>
<textarea cols="5" rows="5" class="form-control" name="description">{{$ticket->description}}</textarea>
</div>
<button type="submit" class="btn btn-primary">Update</button>
</form>
</div>
</div>
@endsection

Also, write the update function.

/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
$ticket = new Ticket();
$data = $this->validate($request, [
'description'=>'required',
'title'=> 'required'
]);
$data['id'] = $id;
$ticket->updateTicket($data);

return redirect('/home')->with('success', 'New support ticket has been updated!!');
}

Also, code the model function updateTicket().


public function updateTicket($data)
{
$ticket = $this->find($data['id']);
$ticket->user_id = auth()->user()->id;
$ticket->title = $data['title'];
$ticket->description = $data['description'];
$ticket->save();
return 1;
}

Step 7: Code the delete ticket function.
Define the route for the function.

Route::delete('/delete/ticket/{id}','TicketController@destroy');

Now, full index.blade.php view is like the following.

@extends('layouts.app')

@section('content')
<div class="container">
<table class="table table-striped">
<thead>
<tr>
<td>ID</td>
<td>Title</td>
<td>Description</td>
<td colspan="2">Action</td>
</tr>
</thead>
<tbody>
@foreach($tickets as $ticket)
<tr>
<td>{{$ticket->id}}</td>
<td>{{$ticket->title}}</td>
<td>{{$ticket->description}}</td>
<td><a href="{{action('TicketController@edit',$ticket->id)}}" class="btn btn-primary">Edit</a></td>
<td>
<form action="{{action('TicketController@destroy', $ticket->id)}}" method="post">
{{csrf_field()}}
<input name="_method" type="hidden" value="DELETE">
<button class="btn btn-danger" type="submit">Delete</button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
<div>
@endsection

The whole TicketController.php file looks like the following.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Ticket;

class TicketController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$tickets = Ticket::where('user_id', auth()->user()->id)->get();

return view('user.index',compact('tickets'));
}

/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
return view('user.create');
}

/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$ticket = new Ticket();
$data = $this->validate($request, [
'description'=>'required',
'title'=> 'required'
]);

$ticket->saveTicket($data);
return redirect('/home')->with('success', 'New support ticket has been created! Wait sometime to get resolved');
}

/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}

/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
$ticket = Ticket::where('user_id', auth()->user()->id)
->where('id', $id)
->first();

return view('user.edit', compact('ticket', 'id'));
}

/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
$ticket = new Ticket();
$data = $this->validate($request, [
'description'=>'required',
'title'=> 'required'
]);
$data['id'] = $id;
$ticket->updateTicket($data);

return redirect('/home')->with('success', 'New support ticket has been updated!!');
}

/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
$ticket = Ticket::find($id);
$ticket->delete();

return redirect('/home')->with('success', 'Ticket has been deleted!!');
}
}
Share on Facebook0Tweet about this on Twitter0Share on Google+0Pin on Pinterest0Share on LinkedIn0Share on Reddit0
It's only fair to share...

Add Comment

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