Передача поля из другой таблицы на итерацию - PullRequest
0 голосов
/ 04 мая 2018

Я использую golang с sqlx и пытаюсь показать на странице следующий вывод:

app_monitor.name    |  app_domains.name

По сути, он получает все monitor.name на основе идентификатора пользователя и получает имя_домена из другой таблицы. Я не могу получить доменное имя из другой таблицы. Поиск имени монитора выполнен успешно. Должен ли я получить имя_домена в модели, контроллере или шаблонизаторе?

Вот несколько полей в моей базе данных:

app_monitor: id, name, domain_id
user: id, domain_id
app_domains: id, name

Фрагмент моей модели:

type Monitor struct {
    ID          uint32        `db:"id"` // Don't use Id, use MonitorID() instead for consistency with MongoDB
    Name        string        `db:"name"`
    DID         uint32        `db:"domain_id"`
    CreatedAt   time.Time     `db:"created_at"`
    UpdatedAt   time.Time     `db:"updated_at"`
    Status      uint8         `db:"status"`
    }
    func MonitorByUserID(userID string) ([]Monitor, error) {
    var err error

    var result []Monitor

    switch database.ReadConfig().Type {
    case database.TypeMySQL:
        err = database.SQL.Select(&result, "SELECT app_monitor.id, app_monitor.name, app_monitor.status FROM app_monitor LEFT JOIN user ON app_monitor.domain_id = user.domain_id WHERE user.id = ?", userID)
    default:
        err = ErrCode
    }

    return result, standardizeError(err)
}

Мой контроллер

func MonitorReadGET(w http.ResponseWriter, r *http.Request) {
    // Get session
    sess := session.Instance(r)

    userID := fmt.Sprintf("%s", sess.Values["id"])

    monitors, err := model.MonitorByUserID(userID)
    if err != nil {
        log.Println(err)
        monitors = []model.Monitor{}
    }

    // Display the view
    v := view.New(r)
    v.Name = "monitor/read"
    v.Vars["first_name"] = sess.Values["first_name"]
    v.Vars["monitors"] = monitors
    v.Render(w)
}

И, наконец, мой шаблон

    <table class="table table-striped table-hover">
    <tr>
        <th scope="col-9">Monitor</th>
        <th scope="col-3">Action</th>
    </tr>
        {{range $n := .monitors}}
    <tr>
        <td>{{.Name.DomainName}}</td>
        <td><a title="Edit Monitor" class="btn btn-warning" role="button" href="{{$.BaseURI}}monitor/update/{{.MonitorID}}">
            <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Edit
            </a>
            <a title="Delete Monitor" class="btn btn-danger" role="button" href="{{$.BaseURI}}monitor/delete/{{.MonitorID}}">
                <span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Delete
            </a>
        </td>
    </tr>
        {{end}}
</table>

Но там написано

Template File Error: template: read.tmpl:27:47: executing "content" at <.Name.DomainName>: can't evaluate field DomainName in type string

Как мне этого добиться?

1 Ответ

0 голосов
/ 04 мая 2018

Непосредственная проблема в шаблоне:

<td>{{.Name.DomainName}}</td>

Имя определяется как поле string для типа Monitor. Будучи строкой, она не имеет подполя с именем DomainName. Отсюда и ошибка:

не может оценить поле DomainName в строке типа

Кроме того,
database.SQL.Select(&result, "SELECT app_monitor.id, app_monitor.name, app_monitor.status FROM app_monitor LEFT JOIN user ON app_monitor.domain_id = user.domain_id WHERE user.id = ?", userID)
оператор в пакете модели не получает имя домена. Вы захотите выбрать другие поля модели, которые также должны быть отображены. После правильного обновления SQL следующий фрагмент должен отобразить желаемый результат:

<td>{{.Name}}</td>
<td>{{.DomainName}}</td>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...