我有以下结构:
type User struct {
ID uuid.UUID `gorm:"type:uuid"`
BirthDate *BirthDate `gorm:"<-"`
BirthDateID uuid.UUID
}
type BirthDate struct {
ID uuid.UUID `gorm:"type:uuid"`
Year int
Month int
Day int
}
(这些是组成结构)。所以基本上用户和出生日期之间存在一对一的关系,我们假设两个用户不能在同一天出生。
我希望能够检索2022年出生的所有用户,所以我有以下内容:
var result []*User
birthDateExample := BirthDate{Year:2022}
DB.Debug().Joins("BirthDate", s.Database.Select("id").Where(birthDateExample)).Preload(clause.Associations).Find(&result)
但是它正在进行左连接查询,所以我得到了更多我想要的结果:
SELECT `users`.`id`,`users`.`birth_date_id`,`BirthDate`.`id` AS `BirthDate__id`,`BirthDate`.`year` AS `BirthDate__year`,`BirthDate`.`month` AS `BirthDate__month`,`BirthDate`.`day` AS `BirthDate__day` FROM `reports` LEFT JOIN `birth_dates` `BirthDate` ON `users`.`birth_date_id` = `BirthDate`.`id` AND `BirthDate`.`year` = "2022"
如何指定我想要内部联接?因为如果我将查询编写为以下内容,它就会起作用:
DB.Debug().Joins("JOIN birth_dates on birth_dates.id = users.billing_month_id and birth_dates.year = ?", 2022).Preload(clause.Associations).Find(&result)
但我宁愿使用以前的方法,Joins("BirthDates", query)。
Joins
的
行为是执行 LEFT JOIN,无论出于何种原因。要获得内部联接,您可以使用
InnerJoins
方法:
DB.Debug()
.InnerJoins("BirthDate", s.Database.Select("id").Where(birthDateExample))
.Preload(clause.Associations)
.Find(&result)