我最近开始使用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 |
我在文档中看不到其他方式。