须要别名的场景有两种:数据库
承接上文,使用我这篇记录里的不严谨案例ui
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字段的状况下获取到每条记录对应的地址了.net
第一种状况只是两个表联查,当须要三个表联查时code
与上一篇记录中的 BuildingMailboxLink 不一样,不适用定义表的结构体,而使用上文中定义的辅助结构体,以下orm
type MailAddrBuildingLink struct{ MailBoxAddress `xorm:"extends"` Building `xorm:"extends"` Link `xorm:"extends"` }
这时,因为mailboxaddr查询与building内联,出现了须要给inner join的表添加别名的状况blog
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”文档
方法不难,一点就通,但在官方文档上很差找。get