记录下beego 多对多模型查询的吐血经历

最近写一个博客练手,文章功能需要增加一个标签的功能,一篇文章可以有多个标签,一个标签可以被多个文章使用,于是就想用m2m模型实现,过程如下

文章模型简化如下:

type Article struct {

    Id          int       `form:"-"`
    //这个是标签
    Label       []*Label  `orm:"rel(m2m);rel_through(blog/models.Articlelabel)"`

}

这里说一下这个rel_through, 官方文档的说法是pkg.models.struct 用点儿连接,但是实际情况不是路径还是要用/ 不知道是不是我对官方文档理解有问题,还是官方的说法有瑕疵

下面是标签模型:

type Label struct {
    Id int `form:"-"`
    Title string `form:"title"`
    //这个是文章关联
    Article []*Article `orm:"reverse(many)"`
}

下面是关联模型

type Articlelabel struct {
    Id int 
    Article *Article `orm:"rel(fk)"`
    Label *Label `orm:"rel(fk)"`
}

注意关联模型中的 ArticleLabel 都不能加id 查询会自动加上

我的列表查询如下

func ArtList() ([]Article, error) {
    var list []Article

    o := orm.NewOrm()
    orm.Debug = true
    _, err := o.QueryTable("article").RelatedSel().Limit(10).All(&list)
    if err != nil {
        return []Article{}, err
    }
        //这个是正确的写法
    /*for k,_ := range list {
        o.LoadRelated(&list[k], "Label")
            
    }*/
      
        //这个是错误的写法
        for _, v := range list {
        o.LoadRelated(v, "Label")       
    }

    return list, nil
}

然后就报错了

2020/03/01 18:54:29.795 [C] [panic.go:679]  the request url is  /admin/article
2020/03/01 18:54:29.795 [C] [panic.go:679]  Handler crashed with error <Ormer> cannot use non-ptr model struct `blog/models.Article`
...

Article 结构体空指针,于是我查阅了文档,发现 LoadRelated参数都是指针, 下面是文档给的例子

// 载入相应的 Tags
post := Post{Id: 1}
err := o.Read(&post)
num, err := o.LoadRelated(&post, "Tags")

于是我把我的代码也换成了指针o.LoadRelated(&v, "Label"),发现不报错了,但是也没有查询到。这就奇怪了。于是我想到是不是&v 并不是真的指向了原来的结构体,经过谷歌之后发现还真是这样,for循环的时候 &v指向的其实是 v的地址,而不像PHP一样就是原来的参数引用。那就只能用 list[k]来更改了
于是

for k,_ := range list {
        o.LoadRelated(&list[k], "Label")
            
    }

这样就成了,对于查询一条记录同理,只不过不需要循环我的list, 而是直接像官方文档给的例子那样写就可以了

事后我测试

a := [] int {1}
    for k,v := range a {
        fmt.Println(&v)
        fmt.Println(&a[k])
    }
//两个不同的地址
//0x40e024
//0x40e020

看来我还是基础不过关啊,共勉

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Django 准备 “虚拟环境为什么需要虚拟环境:到目前位置,我们所有的第三方包安装都是直接通过 pip inst...
    33jubi阅读 5,110评论 0 5
  • 来自网络 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了。今年,找过工作人可能会更深刻地体会...
    用心在飞阅读 4,276评论 5 4
  • 转盘玄学:  1、抽奖之前要洗洗手,也俗称把手中的晦气洗掉,用一双纯净的双手抽奖,一个不小心说不准就抽中了哦!  ...
    Sep_D_Dai阅读 3,114评论 6 4
  • 以前我国没有今天这样的钟表,古代计时的工具叫“铜壳滴漏”。它是靠铜壶里的水,一滴一滴往下漏来计算时间的长短的。它的...
    简什么阅读 2,271评论 0 3
  • P97-P100 1.按小闹钟:用生活中常见的物品来训练宝宝的听力。 2.妈妈要随时变换藏闹钟的方式和地点,并且注...
    蒲公英_2018阅读 2,635评论 0 1