2 回答
TA贡献2036条经验 获得超8个赞
我可以建议我以前使用过的另一种方法。
在这种情况下,您在查询中生成标签的 json 并将其返回。
优点:您有 1 次调用 db,它聚合数据,您所要做的就是将 json 解析为一个数组。
缺点:有点难看。请随意抨击我。
type jointItem struct {
Item
ParsedTags string
Tags []Tag `gorm:"-"`
}
var jointItems []*jointItem
db.Raw(`SELECT
items.*,
(SELECT CONCAT(
'[',
GROUP_CONCAT(
JSON_OBJECT('id', id,
'name', name
)
),
']'
)) as parsed_tags
FROM items`).Scan(&jointItems)
for _, o := range jointItems {
var tempTags []Tag
if err := json.Unmarshall(o.ParsedTags, &tempTags) ; err != nil {
// do something
}
o.Tags = tempTags
}
编辑:代码可能表现得很奇怪,所以我发现在移动时最好使用临时标签数组而不是使用相同的结构。
TA贡献1851条经验 获得超5个赞
postgres 中的 sql:
create schema temp;
set search_path = temp;
create table item
(
id INT generated by default as identity primary key
);
create table tag
(
id INT generated by default as identity primary key,
name VARCHAR(160),
item_id INT references item (id)
);
create view item_tags as
select id,
(
select
array_to_json(array_agg(row_to_json(taglist.*))) as array_to_json
from (
select tag.name, tag.id
from tag
where item_id = item.id
) taglist ) as tags
from item ;
-- golang query this maybe
select row_to_json(row)
from (
select * from item_tags
) row;
然后golang查询这个sql:
select row_to_json(row)
from (
select * from item_tags
) row;
并解组去结构:
亲:
postgres 管理数据的关系。使用 sql 函数添加/更新数据。
golang 管理业务模型和逻辑。
这很简单。
- 2 回答
- 0 关注
- 170 浏览
添加回答
举报