SQL, левое соединение здесь также вернет foos, с которыми не связаны никакие бары.
select
foo.id
, array_agg(bar.id)
from foo
left join foo_bar_members m on m.foo_id = foo.id
where foo.id = $1
group by foo.id
Если вы заботитесь только о foo, у которых есть бары, тогда нет необходимости присоединение на самом деле.
select
m.foo_id
, array_agg(m.bar_id)
from foo_bar_members m
where m.foo_id = $1
group by m.foo_id
Код go:
const sql = "<one of the queries from above>"
f := new(Foo)
if err := db.QueryRow(sql, 123).Scan(&f.ID, pq.Array(&f.BarIDs)); err != nil {
return err
}
pq.Array
- это функция, которая возвращает значение, реализующее * Интерфейсы 1014 * и driver.Valuer
, и реализация знает, как сканировать массив postgres в срез go или превратить срез go в массив postgres.
I ' Я не знаком с sqlx
, поэтому вполне возможно, что он сам предоставляет некоторую функцию, которая позволяет сканировать массивы, и поэтому использование pq.Array
может быть ненужным. Может быть, кто-то, кто знает лучше, в конечном итоге предоставит свою версию решения.