GORM unsupported data types: &, incorrect schema

WBOY
Release: 2024-02-12 21:18:09
forward
295 people have browsed it

GORM 不支持的数据类型:&、不正确的架构

According to the introduction of php editor Banana, GORM is a popular Go language ORM library, which provides convenient database operation methods. However, GORM does not support all data types, and incorrect schemas may occur when handling certain data types. This means that when using GORM, developers need to pay attention to using supported data types and ensure that the data schema is correct to avoid potential problems. Although GORM is powerful, these limitations require developers to handle it with caution when using it.

Question content

gorm v1.25.1, I tried running on worker, poster and job modelsdb.automigrate(), but encountered [error] Unsupported data type: &[]. The worker and job structures should have a many-to-many relationship , while the poster and job should have a one-to-many relationship. Workers and experiences, workers and preferences should all be one-to-many relationships. please help.

package model

type experience struct {
    gorm.Model
    Company  int    `json:"company"`
    JobTitle string `json:"jobTitle"`
    WorkerID uint
}

type preference struct {
    gorm.Model
    JobTitle string `json:"JobTitle"`
    MinPay   int    `json:"minPay"`
    MaxPay   int    `json:"maxPay"`
    WorkerID uint
}

type Worker struct {
    gorm.Model
    Username     string       `gorm:"uniqueIndex;not null" json:"username"`
        ...more fields
    Experience   []experience `json:"experience"`
    Preference   []preference `json:"preference"`
    AppliedJobs  []Job        `gorm:"many2many:worker_jobs;" json:"appliedJobs"`
}

type Poster struct {
    gorm.Model
    Name       string `gorm:"uniqueIndex;not null" json:"name"`
    Email      string `gorm:"uniqueIndex;not null" json:"email"`
    Phone      string `json:"phone"`
    JobsPosted []Job  `json:"jobsPosted"`
}

type Job struct {
    gorm.Model
    Title       string   `gorm:"uniqueIndex;not null" json:"title"`
        ...more fields
    PosterID uint `json:"posterID"`
}
Copy after login

Solution

I was able to achieve what you need with the following code.

Please note that for the sake of demonstration, I have simplified your model (structure) by including only the relevant fields of the association. If I've missed something worth mentioning, feel free to ask and I'll update my answer.

I will share the code first and then explain it in detail.

package main

import (
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
)

type Worker struct {
    gorm.Model
    Username string `gorm:"uniqueIndex;not null" json:"username"`

    Posters []Poster `gorm:"many2many:workers_posters;joinForeignKey:postersId"`
}

type Poster struct {
    gorm.Model
    Name  string `gorm:"uniqueIndex;not null" json:"name"`
    Email string `gorm:"uniqueIndex;not null" json:"email"`
    Phone string `json:"phone"`

    Workers []Worker `gorm:"many2many:workers_posters;joinForeignKey:workersId"`
    Jobs    []Job
}

type Job struct {
    gorm.Model
    Title    string `gorm:"uniqueIndex;not null" json:"title"`
    PosterID uint   `json:"posterID"`
}

func main() {
    dsn := "host=localhost port=54322 user=postgres password=postgres dbname=postgres sslmode=disable"
    db, err := gorm.Open(postgres.Open(dsn))
    if err != nil {
        panic(err)
    }

    db.AutoMigrate(&Worker{}, &Poster{}, &Job{})
}
Copy after login

Since your question involves both many2many and one2many relationships, I will split my answer into two parts.

many2many Relationship

To implement this relationship, you must add the annotation gorm:"many2many:workers_posters;joinforeignkey:workersid" next to the slice that holds the associated entity. The affected fields are:

  • posters worker field in the structure
  • workers poster field in the structure

Obviously you have to change the value of joinforeignkey depending on the field you want to set.

one2many Relationship

This relationship is even simpler because you don't have to specify the join table that must be created in the many2many association (such as the workers_posters table created above). Here you only need to make these two changes:

  1. Add jobs []job field in the poster
  2. structure
  3. Add the posterid uint field in the job structure

So if you run the automigrate method you will see the correct table in the database and all foreign keys set up correctly.

Please tell me, thank you!

The above is the detailed content of GORM unsupported data types: &, incorrect schema. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!