# 【Elixir】Ecto で名前付きバインドを利用する方法
> Elixir の Ecto ライブラリを使用するとき、クエリの組み立てに柔軟性を持たせる方法の1つとして、名前付きバインドがあります。この記事では、Ecto で名前付きバインドをどのように使用するかを解説します。
- Canonical: https://c-a-p-engineer.github.io/elixir-ecto-name-bindings/
- Published: 2024-04-23T16:00:00.000Z
- Modified: 2024-04-23T16:00:00.000Z
- Categories: Elixir
- Tags: Elixir

Elixir の Ecto ライブラリを使用するとき、クエリの組み立てに柔軟性を持たせる方法の1つとして、名前付きバインドがあります。この記事では、Ecto で名前付きバインドをどのように使用するかを解説します。

## 名前付きバインドの基本

名前付きバインドを使用することで、複数のテーブルを結合するクエリを簡単に管理できます。具体的な例を以下に示します。

### 基本的な結合

```elixir
posts_with_comments =
  from p in Post,
    join: c in Comment,
    as: :comment,
    on: c.post_id == p.id
```

上記の例では、`Post` と `Comment` を結合しており、`as: :comment` オプションを使って、この結合に `comment` という名前を付けています。

### 名前付きバインドを使用する

名前付きバインドがあると、バインドの位置を気にすることなく、以下のようにクエリを構成できます。

```elixir
from [p, comment: c] in posts_with_comments,
select: {
    p.title,
    c.body
}
```

ここでは `posts_with_comments` から `p` （Post）と `c` （Comment）を選択し、そのタイトルと本文を取得しています。

## 高度な使用例

名前付きバインドは、サブクエリや遅延バインドにも使用できます。

### サブクエリと親のバインドを参照

```elixir
child_query =
    from c in Comment,
    where: parent_as(:posts).id == c.post_id

from p in Post,
as: :posts,
inner_lateral_join: c in subquery(child_query)
```

この例では、`child_query` で親クエリのバインド `:posts` を参照しています。これはとくにサブクエリを扱う場合に有効です。

### 汎用的なソート関数

名前付きバインドを活用すると、以下のような汎用的なソート関数も作成できます。

```elixir
def sort(query, as, field) do
  from [{^as, x}] in query, order_by: field(x, ^field)
end
```

この関数では、指定されたバインド名とフィールド名でクエリをソートします。

## まとめ

Ecto の名前付きバインドは、クエリの柔軟性と可読性を高める強力なツールです。とくに複数のテーブルが絡む複雑なクエリを扱う際に、その真価を発揮します。名前付きバインドを適切に使用することで、Elixir アプリケーションのデータハンドリングがより効率的かつエラーに強くなります。

この技術を使って、Elixir の Ecto をさらに活用してみてください。

## 参考

- <a href="https://hexdocs.pm/ecto/3.11.2/Ecto.Query.html#module-named-bindings" target="_blank" rel="nofollow noopener">Ecto.Query - Named bindings</a>
