2

我有以下 gorm.Model,我想查询我的 Postgres 数据库以返回在其 .Categories 属性中具有特定类别的 Confessions,但我不知道如何在 pq.StringArray 中查询。有解决办法吗?

type Confession struct {
    gorm.Model
    User       string         `json:"User"`
    Title      string         `json:"Title"`
    Body       string         `json:"Body"`
    Mood       string         `json:"Mood"`
    Categories pq.StringArray `gorm:"type:varchar(64)[]" json:"Categories"`
}

这是我尝试查询的方式,但使用 LIKE 运算符会引发错误。

if categories != nil {
        for _, cat := range categories {
            tx = tx.Where("Categories LIKE ?", "%"+cat+"%")
        }
    }
4

2 回答 2

2

Use <@ for array contains. You can query using Query function of *sql.DB and get *sql.DB using tx.DB() in gorm

sel := "SELECT * FROM confessions WHERE $1 <@ categories"
categories := []string{"cat1", "cat2"}
rows, err := tx.DB().Query(sel, pq.Array(categories))

Or try Gorm Raw SQL , but I won't sure it will work properly or not for array functions.

References:

  • PostgreSQL Array function here
  • ProtgreSQL Array use in golang here
于 2020-05-27T17:19:36.310 回答
1

解决我的问题的最简单方法是使用 .Where 命令

tx = tx.Where("categories && ?", pq.Array(categories))

这将返回一个 gorm.DB,因此我可以继续链接操作。&& 运算符用于检查 OVERLAPPING 元素。

于 2020-05-28T16:23:53.363 回答