>백엔드 개발 >Golang >Gorm에서 Preload()에 Raw()를 사용하는 방법은 무엇입니까?

Gorm에서 Preload()에 Raw()를 사용하는 방법은 무엇입니까?

WBOY
WBOY앞으로
2024-02-15 10:39:091179검색

如何在 Gorm 中使用 Raw() 进行 Preload() ?

php 편집기 Yuzai가 Gorm에서 Preload()에 Raw()를 사용하는 방법을 소개합니다. Gorm은 데이터베이스 작업을 위한 다양한 편리한 방법을 제공하는 강력한 Go 언어 ORM 라이브러리입니다. 어떤 경우에는 쿼리에 기본 SQL 문을 사용해야 할 수도 있고 Preload() 메서드를 사용하여 관련 데이터를 미리 로드해야 할 수도 있습니다. Raw() 메서드를 사용하면 Gorm에서 Preload()를 결합하여 이 요구 사항을 충족할 수 있습니다. 다음으로, 이 기술을 더 잘 이해하고 적용할 수 있도록 구체적인 단계를 자세히 설명하겠습니다.

질문 내용

이전 프로젝트에서는 복잡한 쿼리를 해야 해서 Raw()를 사용했습니다. 쿼리는 다음과 같습니다.

으아악

gorm의 콘텐츠/메서드를 사용하여 이 작업을 완전히 수행할 수 있는지 확신할 수 없으므로 더 익숙한 간단한 쿼리를 사용합니다. 이제 tbl1.type_id와 관련된 레코드를 가져오고 싶습니다. gorm 中的内容/方法完全做到这一点,所以我只是使用我更熟悉的简单查询。现在,我想获取与 tbl1.type_id 关联的记录。我尝试在 Raw() 之前添加 Preload() 但这似乎不起作用,因为检查我用来存储查询结果的结构数组的内容似乎没有填充 Type 앞에 Preload()를 추가하려고 했지만 쿼리 결과를 저장하는 데 사용하는 구조체 배열의 내용을 검사해도 유형이 채워졌습니다.

업데이트:

둘러본 결과 위의 Raw() 查询转换为 gorm 쿼리를 gorm의 메서드 링크로 변환하는 방법을 찾았습니다. 다음과 같습니다:

으아악

이전 Raw() 查询一样,但它仍然缺少一些东西,这就是获取关联表到 table1 的方法(它是方法链接上的actuator_device_infos,有点懒惰仍然清理新代码)。即使我在查询构建方法之前添加 Preload() ,它似乎也不会影响结果记录。我需要使用 Model() 进行方法链接,并且缺少它会产生错误,因为 Model() 中的解析表将用于最终查询的 FROM 部分,因此 gorm 应该有所了解我想要预加载的东西存在。我预加载的是 actuator_types,它已经有一个 Joins(),如上面的代码所示。

解决方法

感谢@Trock的评论,我终于找到了最后一块拼图。看来我只需要在方法链的末尾使用 Find() ,这样 Preload() 就可以工作。最终的代码看起来就像我在问题上的代码,但我用 Find() 替换了 Scan() 。我尝试对 Raw() 代码执行相同的操作,并且效果也很好。 gorm 쿼리와 동일하게 작동하지만 여전히 뭔가가 누락되어 있습니다. 이는 관련 테이블을 table1로 가져오는 방법입니다(메소드 링크의 Actuator_device_infos이며 새 코드를 정리하기에는 여전히 약간 게으릅니다). 쿼리 작성 메소드 앞에 Preload()를 추가해도 결과 레코드에는 영향을 미치지 않는 것 같습니다. 메서드 체이닝을 위해 Model()을 사용해야 하는데 이를 누락하면 Model()의 구문 분석 테이블이 FROM 섹션이므로 <code>gorm은 내가 미리 로드하려는 항목이 존재한다는 사실을 어느 정도 알아야 합니다. 내가 미리 로드하는 것은 actuator_types이며, 위 코드에 표시된 대로 이미 Joins()가 있습니다.

🎜Solution🎜🎜@Trock님의 댓글 덕분에 드디어 퍼즐의 마지막 조각을 찾았습니다. Preload()가 작동하도록 메서드 체인 끝에 Find()를 사용하기만 하면 되는 것 같습니다. 최종 코드는 질문에 있던 코드와 똑같아 보이지만 Scan()Find()로 대체했습니다. 🎜 코드로 동일한 작업을 시도했는데 역시 잘 작동했습니다. gorm에서는 이 메커니즘을 언급해야 합니다. 🎜

위 내용은 Gorm에서 Preload()에 Raw()를 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제