Apabila membangunkan dan mereka bentuk model pangkalan data, kadangkala kita perlu bertanya sama ada nilai terbenam dalam perhubungan itu sama dengan nilai tertentu. Masalah ini sering dihadapi dalam aplikasi praktikal, tetapi ia mungkin tidak mudah untuk diselesaikan. Dalam artikel ini, saya akan memperkenalkan anda kepada model dengan cara yang cekap untuk bertanya sama ada nilai terbenam perhubungan adalah sama dengan nilai tertentu. Tidak perlu risau, saya akan menerangkannya dengan jelas dalam bahasa yang ringkas dan mudah difahami untuk membantu anda memahami dan mengaplikasikannya dengan cepat dalam pembangunan sebenar. Mari lihat!
Saya mempunyai dua model berbeza (cars
和 types
),它们彼此相关(属于关系),其中两个模型都有一个嵌入式 struct
用于公共数据(post
)。我想检索某些 types
,但只想收到 post
的 cars
jawapan dengan nilai yang sama dengan nilai tertentu.
shorty berkata, berdasarkan model di bawah, saya ingin mencari semua types
,其中cars.post.published
sama dengan benar.
Model
type post struct { published bool } type car struct { gorm.model brand string post post `gorm:"embedded"` } type type struct { gorm.model name string carid uint32 car car post post `gorm:"embedded"` }
Gunakan db.preload("car").find(&type)
我能够在答案对象中获取 car
值。如果我在 car
结构上使用 where()
函数(即 where(car{brand: "volvo"}
) 我可以通过 brand
获取值,但是当使用 post
时(即 where(car{post: post {published: true})
) dan ia hanya akan mengembalikan segala-galanya.
Saya lebih baik menggunakan model utama yang perlu ditanya sebagai asas untuk fungsi where()
. Contohnya:
q := Type{Car: Car{Post: Post{Published: true}}} db.Preload("Car").Where(q).Find(&Type)
...tetapi itu nampaknya tidak berkesan. Bagaimana untuk melaksanakan pertanyaan sedemikian tanpa menggunakan penjana sql mentah?
Saya dapat menyelesaikan masalah anda dengan cara berikut. Mula-mula saya akan berkongsi kod dan kemudian saya akan membincangkan perkara penting yang patut dijelaskan.
package main import ( "fmt" "gorm.io/driver/postgres" "gorm.io/gorm" ) type Post struct { Published bool } type Car struct { gorm.Model Brand string TypeID int Type Type Post Post `gorm:"embedded"` } type Type struct { gorm.Model Name string CarID int Post Post `gorm:"embedded"` } 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(&Car{}) db.AutoMigrate(&Type{}) // uncomment these to seed data // db.Create(&Car{Brand: "Tesla", Type: Type{Name: "SUV", Post: Post{Published: true}}, Post: Post{Published: true}}) // db.Create(&Car{Brand: "Ford", Type: Type{Name: "City", Post: Post{Published: false}}, Post: Post{Published: false}}) var cars []Car if err := db.Debug().Model(&Car{}).Preload("Type").Where(&Car{Post: Post{Published: true}}).Find(&cars).Error; err != nil { panic(err) } for _, v := range cars { fmt.Println(v.Type.Name) } }
Sekarang, izinkan saya berkongsi beberapa pandangan.
Saya mengubahnya sedikit untuk mengendalikan adegan ini. Saya menambah rakan sejawatannya daripada definisi struktur type
结构中删除了 car
字段,并在 car
.
Kemudian, saya menyediakan sambungan pangkalan data melalui gorm. Saya menyegerakkan model yang ditakrifkan dalam kod dengan hubungan yang wujud dalam pangkalan data. Untuk menunjukkan, saya menyemai beberapa data palsu secara manual.
Kemudian, saya menjalankan pertanyaan untuk mendapatkan data yang berkaitan. Saya menggunakan kaedah berikut:
debug
: digunakan untuk merekod penyata sql sebenarmodel
: digunakan untuk menyatakan perhubungan yang ingin kita kendalikanpreload
:用于加载type
Berkaitanwhere
: digunakan untuk menentukan syarat (dalam kes kami, penapis berada pada struktur terbenam) find
: digunakan untuk memetakan hasil kepada pembolehubahSila beritahu saya jika ini membantu menyelesaikan masalah anda, terima kasih!
Atas ialah kandungan terperinci Bagaimana untuk menanyakan model yang nilai tertanam hubungan adalah sama dengan nilai tertentu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!