我最近开始使用Golang,并决定尝试使用GORM作为ORM。
它在大多数情况下都可以很好地工作,但是由于大多数ORM有时是有限的。幸运的是,它与数据库/ sql的关系非常好,因此我可以轻松地执行自定义查询。

我想知道gorm中是否还有其他方法可以做到这一点:
我有一个结构公司,公司与电子邮件,地址和电话具有一对多关系。我在gorm中使用以下代码来提取公司及其相应信息的列表。我使用gorm的预加载功能。

1
2
3
4
5
6
7
8
9
10
db.DBAccess.
    Model(&companies).
    Count(&dbInfo.Count).
    Order("companies.id asc").
    Offset(offset).
    Limit(length).
    Preload("Addresses").
    Preload("Phones").
    Preload("Emails").
    Find(&companies)

这很好用。但是我觉得没有预加载功能还有另一种方法可以完成此操作。有什么想法吗?

  • 你有什么考虑?我一般来说可以实现查询回调,但是我认为这样做不值得。自动延迟加载是不可能的,因为在结构字段上没有拦截机制。
  • 您能否提供模型样本?我希望它能在不显式调用Preload的情况下加载它们,只要正确指定了关系即可。如果没有,则应将某些选项添加到包中,例如CascadingRead,该选项将导致递归实例化,而不是返回带有空数组的对象,该对象应包含与当前对象具有外键关系的许多项目。

您可以稍后使用DB.Related加载相关实体(仅在需要时/如果需要),如文档中所示:

1
2
3
4
5
6
7
8
9
// User has many emails
db.Model(&user).Related(&emails)
//// SELECT * FROM emails WHERE user_id = 111;
// user_id is the foreign key, 111 is user's primary key's value

// Specify the foreign key
db.Model(&user).Related(&emails,"ProfileId")
//// SELECT * FROM emails WHERE profile_id = 111;
// profile_id is the foreign key, 111 is user's primary key's value

我在文档中看不到其他方式。