Laravel - Create CRUD API Service

[1] Open the Laravel Project

Continue from the previous tutorial https://hashnotes.hashnode.dev/laravel-create-user-profile-update-api

[2] Migrate new table

[2.1] Create migration file

Run artisan command:

php artisan make:migration create_reports_table --create=reports

[2.2] Edit migration file

([file:app/database/migration/xxxx_xx_xx_xxxx..](file://app/database/migration/xxxx_xx_xx_xx..)

Edit function up() to define new fields:

    public function up(): void
    {
        Schema::create('reports', function (Blueprint $table) {
            $table->id();
            $table->string("repref", 100);
            $table->string("repdate", 8);
            $table->string("reptime", 8);
            $table->string("replocn", 100);
            $table->string("replocndesc", 100);
            $table->text("reppict1");
            $table->text("reppict1thum");
            $table->text("reppict2");
            $table->text("reppict2thum");
            $table->text("reppict3");
            $table->text("reppict3thum");
            $table->enum("repfire", ['y', 'n'])->default('n');
            $table->enum("reptrap", ['y', 'n'])->default('n');
            $table->enum("repinju", ['y', 'n'])->default('n');
            $table->integer("user_id");
            $table->timestamps();
        });
    }

[2.3] Run migration

Warning: Before running the migration, for windows console developers, you have to edit database path according to the windows path style in the env file e.g. DB_DATABASE=database/rear.sqlite .

Run migration.

php artisan migrate

[3] Define Model

[3.1] Create Model

Run artisan command:

php artisan make:model Report

[3.2] Edit Model

([file:app/Models/Report.php](file:app/Models..)

<?php

namespace App\Models;

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

class Report extends Model
{
    use HasFactory;
    protected $fillable = [
        'repref',
        'repdate',
        'reptime',
        'replocn',
        'replocndesc',
        'reppict1',
        'reppict1thum',
        'reppict2',
        'reppict2thum',
        'reppict3',
        'reppict3thum',
        'repfire',
        'reptrap',
        'repinju',
        'user_id',        
     ];      
}

[4] Define the Controller

The controller will handle CRUD activities.

[4.1] Create Controller

Therefore add the parameter --resource to the artisan command:

php artisan make:controller Api/ReportController --resource

[4.2] Edit Controller

(file: app\Http\Controllers\Api\ReportController.php)

store(Request $request):

    public function store(Request $request)
    {
        $report = new Report;     
        $report->repref = $request->repref;
        $report->repdate = $request->repdate;
        $report->reptime = $request->reptime;
        $report->replocn = $request->replocn;
        $report->replocndesc = $request->replocndesc;

        $report->reppict1 = Image::make($request->reppict1)->fit(1000)->encode ('data-url');            
        $report->reppict1thum = Image::make($request->reppict1)->fit(100)->encode ('data-url');

        $report->reppict2 = Image::make($request->reppict2)->fit(1000)->encode ('data-url');            
        $report->reppict2thum = Image::make($request->reppict2)->fit(100)->encode ('data-url');

        $report->reppict3 = Image::make($request->reppict3)->fit(1000)->encode ('data-url');            
        $report->reppict3thum = Image::make($request->reppict3)->fit(100)->encode ('data-url');

        $report->repfire = $request->repfire;
        $report->reptrap = $request->reptrap;
        $report->repinju = $request->repinju;
        $report->user_id = $request->user_id;    
        $report->save();

        return response()->json([
            'stus' => 'stored',
        ],200); 
    }

update(Request $request, string $id):

    public function update(Request $request, string $id)
    {

        $report = Report::find($id);

        $report_data = [
            'repref' => $request->repref,
            'repdate' => $request->repdate,
            'reptime' => $request->reptime,
            'replocn' => $request->replocn,
            'replocndesc' => $request->replocndesc,            
            'repfire' => $request->repfire,
            'reptrap' => $request->reptrap,
            'repinju' => $request->repinju,
            'user_id' => $request->user_id
        ];

            $report_data['reppict1'] = $request->reppict1;            
            $report_data['reppict1thum'] = $request->reppict1;

            $report_data['reppict2'] = $request->reppict2;            
            $report_data['reppict2thum'] = $request->reppict2;

            $report_data['reppict3'] = $request->reppict3;            
            $report_data['reppict3thum'] = $request->reppict3;

        $report->update($report_data);
        return response()->json([
            'stus' => 'updated',
        ],200);
    }

selectbyuserlatest(string $id):

    public function selectbyuserlatest(string $id)
    {
      //$report = Report::where("user_id",$request->user_id)->first(); //get first item example
      //$report = Report::where("user_id",$request->user_id)->latest()->first(); //get last item example

      $report=Report::select('repref', 'repdate','reptime','replocn','replocndesc',
      'reppict1thum','reppict2thum','reppict3thum','repfire','reptrap','repinju','user_id')
      ->where('user_id',$id)->latest()->first();

      return response()->json([
        'report'=> $report,
        'stus' => 'edit',
      ],200); 
    }

[5] Update API Routes

(file: routes\api.php )

use App\Http\Controllers\Api\ReportController;
Route::middleware('auth:sanctum')->post('/report',[ReportController::class, 'store']);
Route::middleware('auth:sanctum')->post('/report/user/{id}/last',
[ReportController::class, 'selectbyuserlatest']);