Как правильно использовать метод RelatedSel() на платформе beego

Я знаю, что это очень просто, но я думаю, что официальная документация на [веб-сайте beego][1]

[1]: http://beego.me/docs/mvc/model/query.md не дает четкого направления.

Я сделал RESTful API, используя платформу beego. Как и было обещано, он генерирует базовый код CRUD для моего приложения. Проблема в том, что метод READ не возвращает все данные. Под всеми данными я подразумеваю данные в таблице, включая данные из всех связанных с ней таблиц.

это вывод сгенерированного кода (я использую swagger для его вызова):

{
  "data": [
    {
      "Id": 1,
      "CustomerId": {
        "Id": 2,
        "Name": "",
        "Phone": "",
        "Email": "",
        "CreatedAt": "0001-01-01T00:00:00Z",
        "UpdatedAt": "0001-01-01T00:00:00Z"
      },
      "Saldo": 2500000,
      "CreatedAt": "2014-12-10T08:10:10+07:00",
      "UpdatedAt": "2014-12-10T08:10:10+07:00"
    }
  ],
  "totals": 1
}

видите, он не возвращает имя, телефон и адрес электронной почты. поэтому я просматриваю документацию и нашел этот метод RelatedSel(), но до сих пор не знаю, как его правильно использовать.

вот мой код:

func GetAllCustomerSaldo(query map[string]string, fields []string, sortby []string, order []string,
    offset int64, limit int64) (ml []interface{}, err error, totals int64) {
    o := orm.NewOrm()
    qs := o.QueryTable(new(CustomerSaldo))
    qs.RelatedSel("CustomerId__Customers").All(&CustomerSaldo{})
...

попробовав множество вариантов параметров, я все равно получаю эту ошибку:

Handler crashed with error unknown model/table name `Customers`

У кого-нибудь здесь есть такая же проблема со мной? какое-нибудь решение, ребята?


person under5hell    schedule 10.12.2014    source источник


Ответы (2)


У меня была немного другая проблема, но решение, которое я нашел, может помочь и с этой проблемой. Я нашел решение здесь https://github.com/astaxie/beego/issues/1258

Вам нужно вызвать qs.RelatedSel() без параметров (или с параметром int, который отвечает о глубине выбора отношения) и вручную вызвать LoadRelated для каждой записи

func GetAllCustomerSaldo(query map[string]string, fields []string, sortby []string, order []string,
    offset int64, limit int64) (ml []interface{}, err error, totals int64) {
    o := orm.NewOrm()
    qs := o.QueryTable(new(CustomerSaldo))
    qs.RelatedSel().All(&CustomerSaldo{})
    ...
}

o := orm.NewOrm()
for _, el := range arr {
   o.LoadRelated(el, "CustomerId")
}

RelatedSel похож на LeftOuterJoin

person outdead    schedule 02.12.2016

Нет необходимости в LoadRelated после RelatedSel - потому что RelatedSel автоматически получит данные одним запросом к БД (конечно, при правильном использовании). LoadRelated — делаем то же самое, но в дополнительных запросах. Когда вы используете RelatedSel, а после этого LoadRelated - вы будете делать что-то дважды.

  orm.Debug = true

  o := orm.NewOrm()
  qs := o.QueryTable(&models.MainModel{})

  var req []*models.RelatedModel

  num, err := qs.RelatedSel().All(&req)

  beego.Debug(num)

  if err != nil {
    beego.Error(err)
  }
person Bartłomiej Blicharski    schedule 10.02.2020