Heim  >  Artikel  >  Backend-Entwicklung  >  Wie verwende ich Raw() für Preload() in Gorm?

Wie verwende ich Raw() für Preload() in Gorm?

WBOY
WBOYnach vorne
2024-02-15 10:39:091114Durchsuche

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

php-Editor Yuzai zeigt Ihnen, wie Sie Raw() für Preload() in Gorm verwenden. Gorm ist eine leistungsstarke ORM-Bibliothek der Go-Sprache, die viele praktische Methoden für Datenbankoperationen bietet. In einigen Fällen müssen wir möglicherweise native SQL-Anweisungen für Abfragen verwenden und möchten auch die Preload()-Methode verwenden, um zugehörige Daten vorab zu laden. Durch die Verwendung der Raw()-Methode können wir Preload() in Gorm kombinieren, um diese Anforderung zu erfüllen. Als nächstes erklären wir Ihnen die einzelnen Schritte im Detail, damit Sie diese Technik besser verstehen und anwenden können.

Frageninhalt

In meinem vorherigen Projekt musste ich einige komplexe Abfragen durchführen, also habe ich Raw() verwendet. Die Abfrage sieht so aus:

SELECT tbl1.id, tbl1.some_name, tbl5.some_status, tbl1.some_tbl2_id, tbl1.type_id, tbl1.created_at, tbl5.name
FROM table1 tbl1
JOIN table2 tbl2 ON tbl1.some_tbl2_id = tbl2.id
JOIN table3 tbl3 ON tbl3.edge_device_info_id = tbl2.id
JOIN table4 tbl4 ON tbl4.id = tbl3.account_id
LEFT JOIN table5 tbl5 ON tbl5.tbl1_id = tbl1.id
WHERE tbl5.tbl1_id IS NULL OR tbl5.updated_at = (
    SELECT MAX(updated_at)
    FROM table5
    WHERE tbl1_id = tbl1.id
)
ORDER BY tbl1.created_at ASC;

Ich bin mir nicht ganz sicher, ob ich das vollständig mit den Inhalten/Methoden in gorm bewerkstelligen kann, daher verwende ich einfach eine einfache Abfrage, mit der ich besser vertraut bin. Jetzt möchte ich den mit tbl1.type_id verknüpften Datensatz abrufen. Ich habe versucht, Preload() vor dem gorm 中的内容/方法完全做到这一点,所以我只是使用我更熟悉的简单查询。现在,我想获取与 tbl1.type_id 关联的记录。我尝试在 Raw() 之前添加 Preload() 但这似乎不起作用,因为检查我用来存储查询结果的结构数组的内容似乎没有填充 Type hinzuzufügen, aber das scheint nicht zu funktionieren, da die Überprüfung des Inhalts des Arrays von Strukturen, die ich zum Speichern der Abfrageergebnisse verwende, das Typ ausgefüllt.

Update:

Nachdem ich mich umgesehen hatte, fand ich eine Möglichkeit, die obige Raw() 查询转换为 gorm Abfrage in den Methodenlink von gorm umzuwandeln. Es sieht so aus:

Model(models.ActuatorDeviceInfo{}).Preload("ActuatorDeviceInfo.Type").
Select("actuator_device_infos.*, actuator_device_infos.id, at.*").
Joins("JOIN edge_device_infos edi ON actuator_device_infos.parent_edge_device_id = edi.id").
Joins("JOIN user_owned_edge_devices ae ON ae.edge_device_info_id = edi.id").
Joins("JOIN accounts acc ON acc.id = ae.account_id").
Joins("JOIN actuator_types at ON at.id = actuator_device_infos.type_id").
Joins("LEFT JOIN actuator_updates au ON au.actuator_device_info_id = actuator_device_infos.id").
Where("au.actuator_device_info_id IS NULL OR au.updated_at = (?)",
    helpers.GetDB().Model(&models.ActuatorUpdate{}).Select("MAX(updated_at)").
    Where("au.actuator_device_info_id = actuator_device_infos.id")).
Order("actuator_device_infos.created_at DESC").
Scan(&actuator_device_infos)

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

解决方法

感谢@Trock的评论,我终于找到了最后一块拼图。看来我只需要在方法链的末尾使用 Find() ,这样 Preload() 就可以工作。最终的代码看起来就像我在问题上的代码,但我用 Find() 替换了 Scan() 。我尝试对 Raw() 代码执行相同的操作,并且效果也很好。 gorm-Abfrage, aber es fehlt noch etwas, nämlich die Methode, um die zugehörige Tabelle zu Tabelle1 zu bringen (es ist „actuator_device_infos“ auf dem Methodenlink, etwas faul, um den neuen Code zu bereinigen). Selbst wenn ich Preload() vor der Abfrageerstellungsmethode hinzufüge, scheint dies keine Auswirkungen auf die resultierenden Datensätze zu haben. Ich muss Model() für die Methodenverkettung verwenden, und wenn ich es verpasse, entsteht ein Fehler, da die Parsing-Tabelle in Model() für das FROM, sodass <code>gorm eine Vorstellung davon haben sollte, dass das Zeug, das ich vorladen möchte, existiert. Das, was ich vorab lade, ist actuator_types, das bereits über ein Joins() verfügt, wie im obigen Code gezeigt.

🎜Lösung🎜🎜Dank @Trocks Kommentar habe ich endlich das letzte Puzzleteil gefunden. Es scheint, dass ich nur Find() am Ende der Methodenkette verwenden muss, damit Preload() funktioniert. Der endgültige Code sieht genauso aus wie der Code, den ich in der Frage hatte, aber ich habe Scan() durch Find() ersetzt. Ich habe dasselbe mit dem 🎜-Code versucht und es hat auch gut funktioniert. gorm sollte diesen Mechanismus erwähnen. 🎜

Das obige ist der detaillierte Inhalt vonWie verwende ich Raw() für Preload() in Gorm?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen