わからないこと
AuthorとBooksの関係は1:nとします。複数のAuthorを全出力する方法がわかりません。
EchoフレームワークとMysqlDBを用いています。
つまり、下記のコードにおいて、ResponseAuthorsをJSON出力したいです。
ResponseAuthor(単体)についてはJSON出力を試行錯誤の末できるようになりました。
{ authors: [ { id: 6, name: "Taro", books: null // ← ここを出力させたい!!!! }, { id: 7, name: "Tanaka", books: null // ← ここを出力させたい!!!! }, { id: 8, name: "Masato", books: null // ← ここを出力させたい!!!! } ] }
前提コード
DBに値は格納されているとします。
go
1 2var ( 3 authortable = "authorinfo" 4 booktable = "bookinfo" 5 seq = 1 6 conn, err = dbr.Open("mysql", "root:@tcp(localhost:3306)/workout", nil) 7 sess = conn.NewSession(nil) 8) 9 10Author struct { 11 Id int `db:"id" json:"id"` 12 Name string `db:"name" json:"name"` 13} 14 15// DB BookInfo table 16Book struct { 17 Id int `db:"id" json:"id"` 18 AuthorId int `db:"author_id" json:"author_id"` // FK 19 Name string `db:"name" json:"name"` 20} 21 22ResponseAuthors struct { 23 Authors []ResponseAuthor `json:"authors"` 24} 25 26ResponseAuthor struct { 27 Id int `json:"id"` 28 Name string `json:"name"` 29 Books []ResponseBook `json:"books"` 30} 31 32ResponseBook struct { 33 Id int `json:"id"` 34 AuthorId int `json:"author_id"` // FK 35 Name string `json:"name"` 36} 37 38ResponseBooks struct { 39 Books []ResponseBook `json:"books"` 40}
-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(50) | NO | | NULL | | +-------+-------------+------+-----+---------+----------------+
+-----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | author_id | int(11) | NO | | NULL | | | name | varchar(50) | NO | | NULL | | +-----------+-------------+------+-----+---------+----------------+
func main() { // Generate Instance e := echo.New() // MiddleWare e.Use(middleware.Logger()) e.Use(middleware.Recover()) ////////// ここについての質問 e.GET("/authors", SelectAuthors) e.GET("/author/:id", SelectAuthor) ////////// ここについての質問 e.Start(":8080") }
本題
go
1func SelectAuthor(c echo.Context) error { 2 var author ResponseAuthor 3 id := c.Param("id") 4 sess.Select("*").From(authortable).Where("id=?", id).Load(&author) 5 sess.Select("*").From(booktable).Where("author_id=?", id).Load(&author.Books) 6 return c.JSON(http.StatusOK, author) 7}
によって、
go
1{ 2 id: 2, 3 name: "Taro", 4 books: [ 5 { 6 id: 3, 7 author_id: 2, 8 name: "Taroの失敗" 9 } 10 ] 11} 12
時間はかかりましたが、上記みたく出力されるようになりました。
全Authorをこのように出力するにはどうすればいいかがわかりません。
{ authors: [ { id: 6, name: "Taro", books: null // ← ここを出力させたい!!!! }, { id: 7, name: "Tanaka", books: null // ← ここを出力させたい!!!! }, { id: 8, name: "Masato", books: null // ← ここを出力させたい!!!! } ] }
長いこと悩んでしまってるので、もしお力をお借りできたらと思っております。
よろしくお願いします。
現在の未完成のコードは下記に掲載します。
go
1func SelectAuthors(c echo.Context) error { 2 var authors ResponseAuthors 3 sess.Select("*").From(authortable).Load(&authors) 4 response := ResponseAuthors{ 5 Authors: nil, 6 } 7 return c.JSON(http.StatusOK, response) 8}
どうぞよろしくお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。