Maison  >  Article  >  développement back-end  >  Comment utiliser Raw() pour Preload() dans Gorm ?

Comment utiliser Raw() pour Preload() dans Gorm ?

WBOY
WBOYavant
2024-02-15 10:39:091114parcourir

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

L'éditeur php Yuzai vous présentera comment utiliser Raw() pour Preload() dans Gorm. Gorm est une puissante bibliothèque ORM en langage Go qui fournit de nombreuses méthodes pratiques pour les opérations de base de données. Dans certains cas, nous pouvons avoir besoin d'utiliser des instructions SQL natives pour les requêtes et également utiliser la méthode Preload() pour précharger les données associées. En utilisant la méthode Raw(), nous pouvons combiner Preload() dans Gorm pour répondre à cette exigence. Ensuite, nous expliquerons en détail les étapes spécifiques pour vous aider à mieux comprendre et appliquer cette technique.

Contenu de la question

Dans mon projet précédent, j'avais besoin de faire des requêtes complexes, j'ai donc utilisé Raw(). La requête ressemble à ceci :

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;

Je ne suis pas sûr de pouvoir le faire complètement en utilisant le contenu/les méthodes de gorm, j'utilise donc simplement une requête simple avec laquelle je suis plus familier. Maintenant, je souhaite obtenir l'enregistrement associé à tbl1.type_id. J'ai essayé d'ajouter Preload() avant le gorm 中的内容/方法完全做到这一点,所以我只是使用我更熟悉的简单查询。现在,我想获取与 tbl1.type_id 关联的记录。我尝试在 Raw() 之前添加 Preload() 但这似乎不起作用,因为检查我用来存储查询结果的结构数组的内容似乎没有填充 Type mais cela ne semble pas fonctionner car l'inspection du contenu du tableau de structures que j'utilise pour stocker les résultats de la requête ne semble pas avoir le Type renseigné.

Mise à jour :

Après avoir regardé autour de moi, j'ai trouvé un moyen de convertir la requête Raw() 查询转换为 gorm ci-dessus en lien de méthode de gorm. Cela ressemble à ceci :

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)

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

解决方法

感谢@Trock的评论,我终于找到了最后一块拼图。看来我只需要在方法链的末尾使用 Find() ,这样 Preload() 就可以工作。最终的代码看起来就像我在问题上的代码,但我用 Find() 替换了 Scan() 。我尝试对 Raw() 代码执行相同的操作,并且效果也很好。 gorm précédente, mais il manque encore quelque chose, qui est la méthode pour amener la table associée à la table1 (c'est activateur_device_infos sur le lien de la méthode, un peu paresseux encore pour nettoyer le nouveau code). Même si j'ajoute Preload() avant la méthode de création de requête, cela ne semble pas affecter les enregistrements résultants. Je dois utiliser Model() pour le chaînage de méthodes, et son absence produit une erreur car la table d'analyse dans Model() sera utilisée pour le FROM, donc <code>gorm devrait avoir une idée que les éléments que je veux précharger existent. Celui que je précharge est actuator_types, qui a déjà un Joins() comme indiqué dans le code ci-dessus.

🎜Solution🎜🎜Grâce au commentaire de @Trock, j'ai enfin trouvé la dernière pièce du puzzle. Il semble que j'ai juste besoin d'utiliser Find() à la fin de la chaîne de méthodes pour que Preload() fonctionne. Le code final ressemble au code que j'avais dans la question, mais j'ai remplacé Scan() par Find(). J'ai essayé de faire la même chose avec le code 🎜 et cela a bien fonctionné aussi. gorm devrait mentionner ce mécanisme. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer