<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Many To Many ## Many To Many Many to Many 會在兩個 model 中添加一張連接表。 例如,您的應用包含了 user 和 language,且一個 user 可以說多種 language,多個 user 也可以說一種 language。 ```go // User 擁有并屬于多種 language,`user_languages` 是連接表 type User struct { gorm.Model Languages []Language `gorm:"many2many:user_languages;"` } type Language struct { gorm.Model Name string } ``` 當使用 GORM 的 `AutoMigrate` 為 `User` 創建表時,GORM 會自動創建連接表 ## 反向引用 ```go // User 擁有并屬于多種 language,`user_languages` 是連接表 type User struct { gorm.Model Languages []*Language `gorm:"many2many:user_languages;"` } type Language struct { gorm.Model Name string Users []*User `gorm:"many2many:user_languages;"` } ``` ## 重寫外鍵 對于 `many2many` 關系,連接表會同時擁有兩個模型的外鍵,例如: ```go type User struct { gorm.Model Languages []Language `gorm:"many2many:user_languages;"` } type Language struct { gorm.Model Name string } // Join Table: user_languages // foreign key: user_id, reference: users.id // foreign key: language_id, reference: languages.id ``` 若要重寫它們,可以使用標簽 `foreignKey`、`reference`、`joinforeignKey`、`joinReferences`。當然,您不需要使用全部的標簽,你可以僅使用其中的一個重寫部分的外鍵、引用。 ```go type User struct { gorm.Model Profiles []Profile `gorm:"many2many:user_profiles;foreignKey:Refer;joinForeignKey:UserReferID;References:UserRefer;JoinReferences:ProfileRefer"` Refer uint } type Profile struct { gorm.Model Name string UserRefer uint } // Which creates join table: user_profiles // foreign key: user_refer_id, reference: users.refer // foreign key: profile_refer, reference: profiles.user_refer ``` ## 自引用 Many2Many 自引用 many2many 關系 ```go type User struct { gorm.Model Friends []*User `gorm:"many2many:user_friends"` } // Which creates join table: user_friends // foreign key: user_id, reference: users.id // foreign key: friend_id, reference: users.id ``` ## 預加載 GORM 允許通過 `Preload` 預加載 has many 關聯的記錄,查看 [預加載](./preload.md) 獲取詳情 ## Many2Many 的 CURD 查看 [關聯模式](./associations.md#Association-Mode) 獲取 many2many 相關的用法 ## 自定義連接表 `連接表` 可以是一個全功能的模型,支持 `Soft Delete`、`鉤子`、定義更多的字段,就跟其它模型一樣。您可以通過 `SetupJoinTable` 指定它,例如: ```go type Person struct { ID int Name string Addresses []Address `gorm:"many2many:person_addresses;"` } type Address struct { ID uint Name string } type PersonAddress struct { PersonID int AddressID int CreatedAt time.Time DeletedAt gorm.DeletedAt } func (PersonAddress) BeforeCreate(db *gorm.DB) error { // ... } // PersonAddress 必須定義相關的的外鍵字段,否則會報錯 db.SetupJoinTable(&Person{}, "Addresses", &PersonAddress{}) ``` ## 外鍵約束 你可以通過標簽 `constraint` 并帶上 `OnUpdate`、`OnDelete` 實現外鍵約束,例如: ```go type User struct { gorm.Model Languages []Language `gorm:"many2many:user_speaks;"` } type Language struct { Code string `gorm:"primarykey"` Name string } // CREATE TABLE `user_speaks` (`user_id` integer,`language_code` text,PRIMARY KEY (`user_id`,`language_code`),CONSTRAINT `fk_user_speaks_user` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE,CONSTRAINT `fk_user_speaks_language` FOREIGN KEY (`language_code`) REFERENCES `languages`(`code`) ON DELETE SET NULL ON UPDATE CASCADE); ``` ## 復合外鍵 如果您的模型使用了 [復合主鍵](../高級主題/composite_primary_key.md),GORM 會默認啟用復合外鍵。 您也可以覆蓋默認的外鍵、指定多個外鍵,只需用逗號分隔那些鍵名,例如: ```go type Tag struct { ID uint `gorm:"primaryKey"` Locale string `gorm:"primaryKey"` Value string } type Blog struct { ID uint `gorm:"primaryKey"` Locale string `gorm:"primaryKey"` Subject string Body string Tags []Tag `gorm:"many2many:blog_tags;"` SharedTags []Tag `gorm:"many2many:shared_blog_tags;ForeignKey:id;References:id"` LocaleTags []Tag `gorm:"many2many:locale_blog_tags;ForeignKey:id,locale;References:id"` } // Join Table: blog_tags // foreign key: blog_id, reference: blogs.id // foreign key: blog_locale, reference: blogs.locale // foreign key: tag_id, reference: tags.id // foreign key: tag_locale, reference: tags.locale // Join Table: shared_blog_tags // foreign key: blog_id, reference: blogs.id // foreign key: tag_id, reference: tags.id // Join Table: locale_blog_tags // foreign key: blog_id, reference: blogs.id // foreign key: blog_locale, reference: blogs.locale // foreign key: tag_id, reference: tags.id ``` 還可以查看 [復合主鍵](../高級主題/composite_primary_key.md)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看