Bagaimana untuk menanyakan model yang nilai tertanam hubungan adalah sama dengan nilai tertentu?

WBOY
Lepaskan: 2024-02-09 18:39:08
ke hadapan
914 orang telah melayarinya

Bagaimana untuk menanyakan model yang nilai tertanam hubungan adalah sama dengan nilai tertentu?

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!

Kandungan soalan

Saya mempunyai dua model berbeza (carstypes),它们彼此相关(属于关系),其中两个模型都有一个嵌入式 struct 用于公共数据(post)。我想检索某些 types,但只想收到 postcars 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"`
}
Salin selepas log masuk

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)
Salin selepas log masuk

...tetapi itu nampaknya tidak berkesan. Bagaimana untuk melaksanakan pertanyaan sedemikian tanpa menggunakan penjana sql mentah?

Penyelesaian

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)
    }
}
Salin selepas log masuk

Sekarang, izinkan saya berkongsi beberapa pandangan.

Definisi struktur

Saya mengubahnya sedikit untuk mengendalikan adegan ini. Saya menambah rakan sejawatannya daripada definisi struktur type 结构中删除了 car 字段,并在 car.

Tetapan dan Benih

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.

Baca logik

Kemudian, saya menjalankan pertanyaan untuk mendapatkan data yang berkaitan. Saya menggunakan kaedah berikut:

  1. debug: digunakan untuk merekod penyata sql sebenar
  2. model: digunakan untuk menyatakan perhubungan yang ingin kita kendalikan
  3. preload:用于加载typeBerkaitan
  4. where: digunakan untuk menentukan syarat (dalam kes kami, penapis berada pada struktur terbenam)
  5. find: digunakan untuk memetakan hasil kepada pembolehubah

Sila 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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!