ホームページ >バックエンド開発 >Golang >Goravel を使用した CRUD 操作 (Laravel for GO)

Goravel を使用した CRUD 操作 (Laravel for GO)

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-08 06:14:011131ブラウズ

CRUD Operations with Goravel (Laravel for GO)

Goravel について

Goravel は、Gopher が独自のアプリケーションを迅速に構築するための開始足場として、完全な機能と優れたスケーラビリティを備えた Web アプリケーション フレームワークです。

Goravel は Go 開発者にとって Laravel の完璧なクローンです。つまり、私のような PHP 開発者はフレームワークに簡単に慣れ、ほとんど学習することなく書き始めることができます。

インストールから始めましょう。この記事に従ってインストールするか、Goravel 公式ドキュメント Web サイトにアクセスしてください。

// Download framework
git clone https://github.com/goravel/goravel.git && rm -rf goravel/.git*

// Install dependencies
cd goravel && go mod tidy

// Create .env environment configuration file
cp .env.example .env

// Generate application key
go run . artisan key:generate

//start the application
go run .

お気に入りのテキスト エディターでコードを開くと、プロジェクトの構造が Laravel とまったく同じであることがわかります。そのため、Laravel 開発者はそれほど迷うことはありません。

モデル、移行、コントローラー

モデル、移行、コントローラーを作成するには、Laravel で行うのと同じように、artisan コマンドを使用できます。

// create model 
go run . artisan make:model Category

// create migration 
go run . artisan make:migration create_categories_table

// create controller 
go run . artisan make:controller --resource category_controller

データベース/移行フォルダーを確認すると、アップ ファイルとダウン ファイルが作成されていることがわかります。アップ移行ファイルを開いて、その中に以下のコードを貼り付けます。

CREATE TABLE categories (
  id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  name varchar(255) NOT NULL,
  created_at datetime(3) NOT NULL,
  updated_at datetime(3) NOT NULL,
  PRIMARY KEY (id),
  KEY idx_categories_created_at (created_at),
  KEY idx_categories_updated_at (updated_at)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;NGINE = InnoDB DEFAULT CHARSET = utf8mb4;

app/http/controllers フォルダー内を確認すると、category_controller.go ファイルがあり、その中身は以下のようになります。

package controllers

import (
 "github.com/goravel/framework/contracts/http"
)

type CategoryController struct {
 //Dependent services
}

func NewCategoryController() *CategoryController {
 return &CategoryController{
  //Inject services
 }
}

func (r *CategoryController) Index(ctx http.Context) http.Response {
 return nil
} 

func (r *CategoryController) Show(ctx http.Context) http.Response {
 return nil
}

func (r *CategoryController) Store(ctx http.Context) http.Response {
 return nil
}

func (r *CategoryController) Update(ctx http.Context) http.Response {
 return nil
}

func (r *CategoryController) Destroy(ctx http.Context) http.Response {
 return nil
}

次に、 app/http/model 内でカテゴリ モデル ファイルを見つけて、その中に以下のコードを貼り付けます。

package models

import (
 "github.com/goravel/framework/database/orm"
)

type Category struct {
 orm.Model
 Name string
}

ここでは特に何も起こっていません。単にデータ型を使用して fillable を宣言しているだけです。

ルート フォルダー内の api.php ファイルを見つけて、コードを以下のように更新してみましょう:

package routes

import (
 "github.com/goravel/framework/facades"

 "goravel/app/http/controllers"
)

func Api() {
 userController := controllers.NewUserController()
 facades.Route().Get("/users/{id}", userController.Show)

 //Resource route
 categoryController := controllers.NewCategoryController()
 facades.Route().Resource("/category", categoryController)
}

次に、category_controller.go ファイル内のインポートを更新して、以下のように更新しましょう。

import (
 "goravel/app/models"
 "github.com/goravel/framework/contracts/http"
  "github.com/goravel/framework/facades"
)

モデルとファサードをインポートしました。ファサードを使用すると、検証や orm などの多くの便利なものにアクセスできるようになります。orm は GO の ORM です。

コードを書いてみましょう!

コントローラーのメソッドを以下のコードに更新しましょう:

インデックスメソッド

// this is just to pull all categories in our database
func (r *CategoryController) Index(ctx http.Context) http.Response {
 var categories []models.Category

 if err := facades.Orm().Query().Find(&categories); err != nil {
  return ctx.Response().Json(http.StatusInternalServerError, http.Json{
   "error": err.Error(),
  })
 }

 return ctx.Response().Success().Json(http.Json{
  "success": true,
  "message": "Data fetch successfully",
  "data":    categories,
 })
} 

ストアメソッド

func (r *CategoryController) Store(ctx http.Context) http.Response {

// validate the input name that the user is passing
 validation, err := facades.Validation().Make(ctx.Request().All(), map[string]string{
        "name": "required|string",
    })

// check if an error occured, might not be validation error
    if err != nil {
        return ctx.Response().Json(http.StatusInternalServerError, http.Json{
            "success": false,
            "message": "Validation setup failed",
            "error":   err.Error(),
        })
    }

// check for validation errors
    if validation.Fails() {
        return ctx.Response().Json(http.StatusBadRequest, http.Json{
            "success": false,
            "message": "Validation failed",
            "errors":  validation.Errors().All(),
        })
    }

// Create the category
 category := &models.Category{
  Name: ctx.Request().Input("name"),
 }

// save the category and return error if there is any
 if err := facades.Orm().Query().Create(category); err != nil {
  return ctx.Response().Json(http.StatusInternalServerError, http.Json{
   "success": false,
   "errors": err.Error(),
  })
 }

// upon successfull creation return success response with the newly created category
 return ctx.Response().Success().Json(http.Json{
  "success": true,
  "message": "Category created successfully",
  "data":    category,
 })
}

更新メソッド

func (r *CategoryController) Update(ctx http.Context) http.Response {

    validation, err := facades.Validation().Make(ctx.Request().All(), map[string]string{
        "id":   "required",
        "name": "required|string",
    })

    if err != nil {
        return ctx.Response().Json(http.StatusInternalServerError, http.Json{
            "success": false,
            "message": "Validation setup failed",
            "error":   err.Error(),
        })
    }

    if validation.Fails() {
        return ctx.Response().Json(http.StatusBadRequest, http.Json{
            "success": false,
            "message": "Validation failed",
            "errors":  validation.Errors().All(),
        })
    }

// find the category using the id
    var category models.Category
    if err := facades.Orm().Query().Where("id", ctx.Request().Input("id")).First(&category); err != nil {
        return ctx.Response().Json(http.StatusNotFound, http.Json{
            "success": false,
            "message": "Category not found",
        })
    }

// update or return error if there is any
    category.Name = ctx.Request().Input("name")
    if err := facades.Orm().Query().Save(&category); err != nil {
        return ctx.Response().Json(http.StatusInternalServerError, http.Json{
            "success": false,
            "message": "Failed to update category",
            "error":   err.Error(),
        })
    }

// return success if successfull
    return ctx.Response().Success().Json(http.Json{
        "success": true,
        "message": "Category updated successfully",
        "data":    category,
    })
}

メソッドの破棄

func (r *CategoryController) Destroy(ctx http.Context) http.Response {

// find the category by id
 var category models.Category
 facades.Orm().Query().Find(&category, ctx.Request().Input("id"))
 res, err := facades.Orm().Query().Delete(&category)

// return error if there is any
 if err != nil {
  return ctx.Response().Json(http.StatusInternalServerError, http.Json{
  "error": err.Error(),
  })
 }

// return success if successfull
 return ctx.Response().Success().Json(http.Json{
  "success": true,
  "message": "Category deleted successfully",
  "data":    res,
 })
}

次に、データベースをセットアップする必要があります。MySQL を使用します。Gravel にはいくつかのデータベース ドライバーが同梱されていることに注意してください。 .env ファイルを見つけて、以下の行を編集します:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=DATABASE_NAME
DB_USERNAME=DATABASE_USERNAME
DB_PASSWORD=DATABASE_PASSWORD

次に、ターミナルに次のように入力します。

go run . artisan migrate

これにより、DB 内のカテゴリ テーブルが自動的に移行されます。

ここで、サーバーを実行している場合は停止し、再起動する必要があります。

Postman からエンドポイントをテストできるようになりました。カテゴリ エンドポイントにリソースを追加すると、カテゴリ エンドポイントの GET、POST、PUT、または DELETE メソッドにアクセスできるようになります。次の方法でエンドポイントにアクセスできます:

// GET category
http://localhost:3000/category

//POST catgory - with payload
http://localhost:3000/category
{
    "name": "goravel"
}

// PUT category - with payload
http://localhost:3000/category/{id}
{
    "id": 1,
    "name": "laravel"
}

//DELETE category
http://localhost:3000/category/{id}

これが、Goravel を使用して単純な CRUD 操作を行う方法です。

以上がGoravel を使用した CRUD 操作 (Laravel for GO)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。