简介
需要别名的场景有两种:
- 表名太长,需要给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
}
小结
方法不难,一点就通,但在官方文档上不好找。