beego 中使用关联查询( join 查询)
文档所在网址:这里
//使用实例:article:=new(Article) num,err:= o.QueryTable("go_article").RelatedSel().All(&article)
但直接使用 RelatedSel() 是不行,还必须先在 model中定义:
type User struct { Id int Name string Age int }type Article stuct { Id int Title string Content string User *User `orm:"rel(fk)"` //这样写,默认在Article中应该有一个user_id的字段,如果没有,通过beego自动建表的话,它会生成;如果是手动建表,记得把user_id 这个字段加上去 }
定义表字段为"rel(fk)",即外键,要定义其它类型的,请看文档。
命令行自动建表:
orm.RunCommand() //main函数或init函数中需要加这行代码,否则不能自动建表
go build main.go #先在命令行中执行这句,会生成main.exe文件./main orm syncdb -h #-h会提示可用的参数./main orm syncdb -v #建表的同时会显示建表的sql语句
如果使用自动建表,建议不要像上边一样直接写int,string,具体字段字段的方法,见 文档
其实我使用命令行建表最主要的目的是想知道 Article 中的 User 会生成什么字段名,结果就是 user_id,且与你 User 对应表名的前缀没有关系
疑问:
4.1 RelatedSel()可以选择“字段名” RelatedSel("user") 其实只是选择“表名”(实际也不是表名,而是 struct 中对应字段的小写),只有当一个 model 中使用了多个 rel 字段的时候才有意义。但怎么选择关联的 user 表中的指定字段?
4.2 RelatedSel()默认应该是 inner join,但我希望是 left join ,应该怎么写?
4.3 我想看到每次执行数据库操作时使用的 sql 语句,怎么查看?
一点感慨:
个人觉得 beego 自带的 orm 其实挺不好用的,有些概念也很不理解。
作为一个经常写 ThinkPHP 3.2 的码农,使用其它框架的 orm 的时候真的觉得太麻烦。
但话说 orm 到底有什么优势?其实我是一直不理解的,tp3.2 操作数据库的方法真正好用的不是它的 orm,而是它的连贯操作写起来真的很舒服。
其实 beego 的作者也做过一个独立的 orm 用法和 tp3.2 也还是有点像的。
但 github 中能搜到了 star 最多的 go orm 应该是 gorm ,看文档,发现它的用法其实与 tp3.2 的挺像的,我还是比较推荐使用 gorm 的。
原文链接:https://segmentfault.com/a/1190000015775872
原文作者:agui1989