質問編集履歴
1
誤字、文法の修正、題名わかりやすく
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
golang gorm many2many
|
1
|
+
golang gorm many2many 逆参照でのOR/AND検索を行いたい
|
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
Many2Many
|
5
|
+
Many2Many 間で 逆参照を行い And/Or で検索結果を取得したい
|
6
6
|
|
7
7
|
|
8
8
|
|
@@ -58,6 +58,8 @@
|
|
58
58
|
|
59
59
|
|
60
60
|
|
61
|
+
※paramsの取得は出来ています
|
62
|
+
|
61
63
|
※router.go, db.go などは省略します
|
62
64
|
|
63
65
|
|
@@ -76,7 +78,7 @@
|
|
76
78
|
|
77
79
|
|
78
80
|
|
79
|
-
// ここ
|
81
|
+
// !!ここ!!
|
80
82
|
|
81
83
|
output := []models.Problem{}
|
82
84
|
|
@@ -110,7 +112,11 @@
|
|
110
112
|
|
111
113
|
c.HTML(http.StatusOK, "Index.tmpl", gin.H{
|
112
114
|
|
113
|
-
"Title": "
|
115
|
+
"Title": "Index",
|
116
|
+
|
117
|
+
"Result": params,
|
118
|
+
|
119
|
+
"Problems": output,
|
114
120
|
|
115
121
|
})
|
116
122
|
|
@@ -124,14 +130,14 @@
|
|
124
130
|
|
125
131
|
|
126
132
|
|
127
|
-
無理やり実装はした
|
133
|
+
上記のように無理やり実装はしました
|
134
|
+
|
135
|
+
一応動作はします
|
128
136
|
|
129
137
|
|
130
138
|
|
131
139
|
`tag.GetOneByName` は以下のようになっています
|
132
140
|
|
133
|
-
これもおかしなところがあるかもしれません
|
134
|
-
|
135
141
|
|
136
142
|
|
137
143
|
```go
|
@@ -140,9 +146,9 @@
|
|
140
146
|
|
141
147
|
// tagName に部分一致する、Tag.Nameを持つ最初の models.Tag(ID昇順で) レコードを取得する
|
142
148
|
|
143
|
-
// 見つかったら nil, 一件も見つからなかったら er
|
149
|
+
// 見つかったら nil, 一件も見つからなかったら "record not found" を吐く
|
144
|
-
|
150
|
+
|
145
|
-
// Problems も全部取得する ので処理遅い
|
151
|
+
// Problems も全部取得する ので処理遅い はず
|
146
152
|
|
147
153
|
func (self *Tag)GetOneByName(tagName string) error {
|
148
154
|
|
@@ -154,21 +160,25 @@
|
|
154
160
|
|
155
161
|
|
156
162
|
|
157
|
-
一応And検索も無理やり実装はしました
|
163
|
+
一応And検索も無理やり実装はしました
|
158
|
-
|
164
|
+
|
159
|
-
の
|
165
|
+
が、`O(N^3)` 位のアルゴリズムになっています
|
160
|
-
|
161
|
-
|
162
|
-
|
166
|
+
|
167
|
+
|
168
|
+
|
169
|
+
|
170
|
+
|
163
|
-
`gorm.io` の公式Reference
|
171
|
+
`gorm.io` の公式Referenceを見て `Back-Referece`を発見したので
|
164
172
|
|
165
173
|
これは行けるだろうと思ってさんざん弄ったのですが、結局良くわかりませんでした
|
166
174
|
|
167
175
|
|
168
176
|
|
169
|
-
|
177
|
+
普通に考えると `return db.DB.Model( ... ).Where( ... ).Association( ... ).Find( ... )`
|
170
|
-
|
178
|
+
|
171
|
-
のような一行のSQLで取得出来る
|
179
|
+
のような一行のSQLで取得出来ると思うのですが、可能でしょうか
|
180
|
+
|
181
|
+
生のSQLでの解消なども可能であればお願いします
|
172
182
|
|
173
183
|
|
174
184
|
|
@@ -186,7 +196,7 @@
|
|
186
196
|
|
187
197
|
|
188
198
|
|
189
|
-
❯ go go.mod
|
199
|
+
❯ bat go go.mod
|
190
200
|
|
191
201
|
go 1.16
|
192
202
|
|
@@ -214,12 +224,6 @@
|
|
214
224
|
|
215
225
|
|
216
226
|
|
217
|
-
プログラミング歴は2ヶ月くらい
|
218
|
-
|
219
|
-
SQLは昨日知りました `SQL Bolt` というサイトを少しづつやっている最中です
|
220
|
-
|
221
|
-
ORMを使わずにSQLそのまま書けたら簡単に出来るんでしょうかね
|
222
|
-
|
223
227
|
|
224
228
|
|
225
229
|
schemeは以下のとおりです
|
@@ -228,8 +232,6 @@
|
|
228
232
|
|
229
233
|
```bash
|
230
234
|
|
231
|
-
|
232
|
-
|
233
235
|
❯ sqlite3 test.db
|
234
236
|
|
235
237
|
SQLite version 3.31.1 2020-01-27 19:55:54
|