Bun ORMのRelationメソッド仕様
Go
Bun
ORM
バックエンド
知識
基本概念
Relationメソッドは、モデル間の関連性に基づいてデータを取得するための高レベルAPIを提供する。モデル構造体のタグ定義に従って自動的にJOINを生成し、取得したデータをGo構造体に適切にマッピングする。
関連タイプ
rel:has-one: 1対1の関連rel:has-many: 1対多の関連rel:belongs-to: 多対1の関連m2m:中間テーブル名: 多対多の関連
内部動作
-
単一クエリ方式
- 基本的には1つのSQLクエリでJOINを使用してデータを取得
- 取得したデータを適切なGo構造体にマッピング
-
複数クエリ方式
- 関連が複雑な場合、複数のクエリに分割することがある
- 特に多対多関連やネストが深い場合に使用される
使用上の注意点
- WHERE句でテーブルエイリアスを参照する場合、Relationだけでは不十分
- 明示的なJOINが必要になる場合がある
- テーブルエイリアスはBunが自動生成するため、直接制御が難しい
最適化
- N+1問題を自動的に回避するよう設計されている
- 関連が多すぎる場合は、パフォーマンス最適化のために複数クエリに分割
コード例
go
// 基本的な使用法
query.Relation("User")
// ネストした関連
query.Relation("Memos.Categories")
// カスタマイズ
query.Relation("User", func(q *bun.SelectQuery) *bun.SelectQuery {
return q.Column("id", "name")
})Joinメソッドとの併用
複雑なクエリでは、RelationとJoinを併用することで、データマッピングの利便性と細かいクエリ制御の両方を実現できる。
go
query.Relation("Memos").
Relation("Memos.Categories").
Join("LEFT JOIN categories AS c ON c.id = memo_categories.category_id").
Where("c.name LIKE ?", "%keyword%")