ユーザーアイコン

mizuko

20日前

0
0

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. 単一クエリ方式

    • 基本的には1つのSQLクエリでJOINを使用してデータを取得
    • 取得したデータを適切なGo構造体にマッピング
  2. 複数クエリ方式

    • 関連が複雑な場合、複数のクエリに分割することがある
    • 特に多対多関連やネストが深い場合に使用される

使用上の注意点

  • WHERE句でテーブルエイリアスを参照する場合、Relationだけでは不十分
  • 明示的なJOINが必要になる場合がある
  • テーブルエイリアスはBunが自動生成するため、直接制御が難しい

最適化

  • N+1問題を自動的に回避するよう設計されている
  • 関連が多すぎる場合は、パフォーマンス最適化のために複数クエリに分割

コード例

// 基本的な使用法 query.Relation("User") // ネストした関連 query.Relation("Memos.Categories") // カスタマイズ query.Relation("User", func(q *bun.SelectQuery) *bun.SelectQuery { return q.Column("id", "name") })

Joinメソッドとの併用

複雑なクエリでは、RelationとJoinを併用することで、データマッピングの利便性と細かいクエリ制御の両方を実現できる。

query.Relation("Memos"). Relation("Memos.Categories"). Join("LEFT JOIN categories AS c ON c.id = memo_categories.category_id"). Where("c.name LIKE ?", "%keyword%")