如何使用 Gorm 预加载

How to preload with Gorm

我遇到了预加载和关联的障碍

type Entity struct {
  ID           uint `gorm:"primary_key"`
  Username     string
  Repositories []*Repository `gorm:"many2many:entity_repositories"`
}

type Repository struct {
  ID       uint `gorm:"primary_key"`
  Name     string
  Entities []*Entity `gorm:"many2many:entity_repositories"`
} 

对于小用户数,使用下面的预加载就可以了

 db.Preload("Repositories").Find(&list)

也试过

 db.Model(&User{}).Related(&Repository{}, "Repositories").Find(&list)

预加载似乎是 select * entities,然后是使用 SELECT * FROM "repositories" INNER JOIN "entity_repositories" ON "entity_repositories"."repository_id" = "repositories"."id" WHERE ("entity_repositories"."entity_id" IN ('1','2','3','4','5','6','7','8','9','10'))

的内部连接

随着用户数量的增加,这不再可维护,因为它达到了 sqlite 限制 (dev)。我尝试了无数种排列! .. 实际上我想我只是想让它做类似

的事情
SELECT entities.*, repositories.*  
FROM entities 
JOIN entity_repositories ON entity_repositories.entity_id = entities.id
JOIN repositories ON repositories.id = entity_repositories.repository_id
ORDER BY entities.id

并为我填写模型..

我是不是做错了什么?

不幸的是,这正是 GORM 处理预加载的方式。

go-pg 的查询稍好一些,但没有与 GORM 相同的功能。在某些情况下它仍然会进行多次查询。

老实说,我建议仅将 query building 与原始 SQL 一起使用,尤其是当您知道模型在编译时的外观时。我最终在我的项目中采用了这种方法,尽管事实上我并不知道我的模型会是什么样子。

可以试试Joins(),可以在SQL

中执行JOIN语法