Gorm: Plusieurs-à-plusieurs et attributs

Créé le 10 nov. 2015  ·  3Commentaires  ·  Source: go-gorm/gorm

Salut !

Je me demandais quelle serait la meilleure façon de créer une relation plusieurs-à-plusieurs avec des attributs supplémentaires ? Par exemple, j'aimerais avoir Library <--> LibraryHasBook (count) <--> Books . LibraryHasBook aurait les champs suivants (library_id, book_id, count) . Est-ce que quelqu'un a déjà fait ou vu ce modèle ?

je pensais à :

type Library struct {
    ID            uint   `gorm:"primary_key"`
    Name      string
    Books     []LibraryHasBook
}

type LibraryHasBook struct {
    Library   Library   `gorm:"primary_key"`
    Book Book `gorm:"primary_key"`
    Count   uint
}

type Book struct {
    ID            uint   `gorm:"primary_key"`
    Name      string
    Libraries  []LibraryHasBook
}

Et puis en insérant un nouveau livre et les bibliothèques associées avec quelque chose comme :

book := Book{
    Name: "The Lords of the Ring",
    Libraries: []LibraryHasBook {
        LibraryHasBook{
            Library: Library{Name: "Tolkien Specialists"},
            Count: 10,
        },
        LibraryHasBook{
            Library: Library{Name: "Awesome Library"},
            Count: 3,
        },
    },
}
db.Create(&book)

Mais je ne suis pas sûr que cela fonctionnerait (le Go n'est probablement pas valide de toute façon car je l'ai tapé directement dans ce numéro), surtout si GORM serait capable de remplir la bibliothèque de LibraryHasBook, et quelle annotation devrait être utilisée, etc. À la place, j'utilise une transaction, crée des bibliothèques, crée un livre, puis LibraryHasBooks, en spécifiant explicitement le livre/les bibliothèques et le commit, cela fonctionnerait-il mieux ?

Comment serait-il alors possible de se procurer un livre avec ses bibliothèques et de compter ?

Je n'ai rien trouvé de lié dans les docs, pardonnez-moi si je suis aveugle.
Merci beaucoup.

Commentaire le plus utile

Salut @Quentin-M

oui, il est possible de le faire, reportez-vous à l'exemple ci-dessous

package main

import (
    "github.com/davecgh/go-spew/spew"
    _ "github.com/lib/pq"

    "github.com/jinzhu/gorm"
)

type User struct {
    ID         int
    Email      string
    GroupUsers []*GroupUser
}

type Group struct {
    ID         int
    Name       string
    GroupUsers []*GroupUser
}

type GroupUser struct {
    ID      int
    Group   *Group
    GroupID int
    User    *User
    UserID  int
    Owner   bool
}

func (*GroupUser) TableName() string {
    return "group_user"
}

func main() {
    db, err := gorm.Open("postgres", "user=gorm DB.name=gorm sslmode=disable")
    if err != nil {
        panic(err)
    }
    db.AutoMigrate(&User{}, &Group{}, &GroupUser{})

    db.LogMode(true)

    db.Debug().Save(&User{
        Email: "[email protected]",
        GroupUsers: []*GroupUser{
            {
                Group: &Group{
                    Name: "ccc",
                },
                Owner: true,
            },
        },
    })

    var group Group
    if err := db.Preload("GroupUsers.User").First(&group).Error; err != nil {
        panic(err)
    }

    spew.Dump(group)
}

Tous les 3 commentaires

Salut @Quentin-M

oui, il est possible de le faire, reportez-vous à l'exemple ci-dessous

package main

import (
    "github.com/davecgh/go-spew/spew"
    _ "github.com/lib/pq"

    "github.com/jinzhu/gorm"
)

type User struct {
    ID         int
    Email      string
    GroupUsers []*GroupUser
}

type Group struct {
    ID         int
    Name       string
    GroupUsers []*GroupUser
}

type GroupUser struct {
    ID      int
    Group   *Group
    GroupID int
    User    *User
    UserID  int
    Owner   bool
}

func (*GroupUser) TableName() string {
    return "group_user"
}

func main() {
    db, err := gorm.Open("postgres", "user=gorm DB.name=gorm sslmode=disable")
    if err != nil {
        panic(err)
    }
    db.AutoMigrate(&User{}, &Group{}, &GroupUser{})

    db.LogMode(true)

    db.Debug().Save(&User{
        Email: "[email protected]",
        GroupUsers: []*GroupUser{
            {
                Group: &Group{
                    Name: "ccc",
                },
                Owner: true,
            },
        },
    })

    var group Group
    if err := db.Preload("GroupUsers.User").First(&group).Error; err != nil {
        panic(err)
    }

    spew.Dump(group)
}

@jinzhu Comment ajouter et supprimer des éléments dans de telles relations ?

@rbatukaev User , GroupUser sont normaux a de nombreuses relations, reportez-vous à https://github.com/jinzhu/gorm#association -mode

Cette page vous a été utile?
0 / 5 - 0 notes