sql >> データベース >  >> RDS >> Mysql

Many2ManyJoinTableのカスタムフィールド

    方法1

    ドキュメントで確認できることから、現在これを行う可能性のあるクリーンな方法は次のとおりです。

    DB.SetupJoinTable(&Person{}, "Addresses", &PersonAddress{})
    
    addr1 := Address{Name: "addr1"}
    DB.Create(&addr1)
    
    addr2 := Address{Name: "addr2"}
    DB.Create(&addr2)
    
    person := Person{Name: "jinzhu"}
    DB.Create(&person)
    
    // Add an association with default values (i.e. Home = false)
    DB.Model(&person).Association("Addresses").Append(&addr1)
    
    // Add an association with custom values
    DB.Create(&PersonAddress{
        PersonID:  person.ID,
        AddressID: addr2.ID,
        Home:      true,
    })
    

    ここでは、実際の結合テーブルモデルを使用して、必要な値の行を挿入しています。

    関連付けのクエリをフィルタリングすることもできます:

    addr := Address{}
    // Query association with filters on join table
    DB.Where("person_addresses.home = true").
        Model(&person).
        Association("Addresses").
        Find(&addr)
    

    方法2

    Contextを(ab)使用することで、より魔法のような方法があります。 BeforeSaveに値を渡す SetupJoinTableに加えて、フック 上からのコード:

    func (pa *PersonAddress) BeforeSave(tx *gorm.DB) error {
        home, ok := tx.Statement.Context.Value("home").(bool)
        if ok {
            pa.Home = home
        }
        return nil
    }
    
    // ...
    
    DB.WithContext(context.WithValue(context.Background(), "home", true)).
        Model(&person).
        Association("Addresses").
        Append(&addr2)
    

    この方法は私には不快に感じますが、うまくいきます。



    1. キー/値テーブルであるwp_postmetaへの多くの内部結合を使用してクエリを改善する

    2. IRIWorkbenchのER図

    3. Dockerでmysql_upgradeを実行していますか?

    4. SQLが文字列に対して長すぎます