gormfilter

package module
v0.0.0-...-3c00608 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 8, 2021 License: MIT Imports: 6 Imported by: 0

README

gormfilter - dynamic filter like django-filter

Work with Gorm v2.

Installation

go get github.com/nghnam/gormfilter

Example:

package main

import (
        "time"

        "gorm.io/driver/sqlite"
        "gorm.io/gorm"
        "gorm.io/gorm/logger"

        "github.com/nghnam/gormfilter"
)

type Role struct {
        ID   uint   `gorm:"primarykey"`
        Name string `gorm:"type:varchar(15)"`
}

func (Role) TableName() string {
        return "role"
}

type User struct {
        gorm.Model
        Role     Role   `gorm:"foreignkey:RoleID" json:"-" binding:"omitempty"`
        RoleID   uint   `json:"role_id"`
        FullName string `gorm:"type:varchar(50)" json:"full_name"`
        Phone    string `gorm:"type:varchar(20)" json:"phone"`
}

func (User) TableName() string {
        return "user"
}

type UserFilter struct {
        FullName        *string    `filter:"column:full_name;op:contains"`
        Phone           *string    `filter:"column:phone;op:contains"`
        CreatedAtAfter  *time.Time `filter:"column:created_at;op:gte" time_format:"2006-01-02 15:04:05"`
        CreatedAtBefore *time.Time `filter:"column:created_at;op:lte" time_format:"2006-01-02 15:04:05"`
        RoleName        []string   `filter:"column:Role.name;op:!in"` // Join
}

func main() {
        db, _ := gorm.Open(sqlite.Open("sqlite.db"), &gorm.Config{
                Logger: logger.Default.LogMode(logger.Info),
        })
        db.AutoMigrate(Role{})
        db.AutoMigrate(User{})

        timeForm := "2006-01-02 15:04:05"
        fullName := "Nam"
        phone := "555"
        createdAtAfter, _ := time.Parse(timeForm, "2020-01-10 00:00:00")
        createdAtBefore, _ := time.Parse(timeForm, "2020-01-20 00:00:00")
        uf := &UserFilter{
                FullName:        &fullName,
                Phone:           &phone,
                CreatedAtAfter:  &createdAtAfter,
                CreatedAtBefore: &createdAtBefore,
                RoleName:        []string{"Manager", "Staff"},
        }

        var users []User
        db, _ = gormfilter.FilterQuery(db.Model(&User{}), uf)
        _ = db.Find(&users).Error
}
[0.189ms] [rows:0] SELECT `user`.`id`,`user`.`created_at`,`user`.`updated_at`,`user`.`deleted_at`,`user`.`role_id`,`user`.`full_name`,`user`.`phone`,`Role`.`id` AS `Role__id`,`Role`.`name` AS `Role__name` FROM `user` LEFT JOIN `role` `Role` ON `user`.`role_id` = `Role`.`id` WHERE `full_name` LIKE "%Nam%" AND `phone` LIKE "%555%" AND `created_at` >= "2020-01-10 00:00:00" AND `created_at` <= "2020-01-20 00:00:00" AND `Role`.`name` NOT IN ("Manager","Staff") AND `user`.`deleted_at` IS NULL

Expressions

See expression.go

Note

  • sqlite does not support ILIKE expression

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func FilterQuery

func FilterQuery(db *gorm.DB, s interface{}) (*gorm.DB, error)

FilterQuery ...

Types

type Contains

type Contains clause.Eq

Contains LIKE

func (Contains) Build

func (c Contains) Build(builder clause.Builder)

Build ...

type Eq

type Eq = clause.Eq

Eq Equal

type Gt

type Gt = clause.Gt

Gt Greater than

type Gte

type Gte = clause.Gte

Gte Greater than or equal

type IContains

type IContains clause.Eq

IContains ILIKE

func (IContains) Build

func (ic IContains) Build(builder clause.Builder)

Build ...

type In

type In clause.Eq

In ...

func (In) Build

func (in In) Build(builder clause.Builder)

Build ...

type Lt

type Lt = clause.Lt

Lt Less than

type Lte

type Lte = clause.Lte

Lte Less than or equal

type NContains

type NContains clause.Eq

NContains ...

func (NContains) Build

func (nc NContains) Build(builder clause.Builder)

Build ...

type NIContains

type NIContains clause.Eq

NIContains ILIKE

func (NIContains) Build

func (nic NIContains) Build(builder clause.Builder)

Build ...

type Neq

type Neq = clause.Neq

Neq Not Equal

type Nin

type Nin clause.Eq

Nin ...

func (Nin) Build

func (nin Nin) Build(builder clause.Builder)

Build ...

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL