go-xorm别名使用 - Go语言中文社区

go-xorm别名使用


简介

需要别名的场景有两种:

  • 表名太长,需要给Table起别名
  • Inner join

一个不严谨的演示案例

承接上文,使用我这篇记录里的不严谨案例

一种情况

添加一个特别的辅助结构体

type MailBoxAddress{
    Mailbox `xorm:"extends"`
    Addr string
}

获取实例的方法

func GetMailBoxAddress(engine *xorm.Engine, addr string, num int64) (addr *MailBoxAddress,had bool,err error){
    addr = &MailBoxAddress{}
    has,err = engine.Table("mailboxes").Alias("box").Select("box.*, buildings.addr").
        Join("INNER","buildings","box.building_id = buildings.id").
        Where("building.addr = ?",addr).And("box.num = ?",num).Get(addr)
    if err !=nil{
        err = fmt.Errorf("GetMailBoxAddress:%v",err)
    }
    return
}

这样就可以在box数据库不必增加addr字段的情况下获取到每条记录对应的地址了

另一种情况

第一种情况只是两个表联查,当需要三个表联查时

辅助结构体

与上一篇记录中的 BuildingMailboxLink 不同,不适用定义表的结构体,而使用上文中定义的辅助结构体,如下

type MailAddrBuildingLink struct{
    MailBoxAddress `xorm:"extends"`
    Building `xorm:"extends"`
    Link `xorm:"extends"`
}

这时,由于mailboxaddr查询与building内联,出现了需要给inner join的表添加别名的情况

获取实例的方法

func GetMailBoxAddrBuildingLink(engine *xorm.Engine, addr string, num int64,buildingAddr string) (addr *MailAddrBuildingLink ,had bool,err error){
    addr = &MailBoxAddress{}
    has,err = engine.Table("mailboxes").Alias("box").Select("box.*, mailbuilding.addr,buildings.*,links.*").
        Join("INNER",[]string{"buildings","mailbuilding"},"box.building_id = mailbuilding.id").
        Join("INNER","links","box.id = links.mailbox_id").
        Join("INNER","buildings","links.building_id = buildings.id").
        Where("mailbuilding.addr = ?",addr).
        And("box.num = ?",num).
        And("buildings.addr = ?",buildingAddr ).Get(addr)
    if err !=nil{
        err = fmt.Errorf("GetMailBoxAddrBuildingLink:%v",err)
    }
    return
}

这里通过一个 []string{} slice给“buidings”表起了一个别名“mailbuilding”

小结

方法不难,一点就通,但在官方文档上不好找。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/zhnxin_163/article/details/82879893
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 21:24:11
  • 阅读 ( 1352 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢