DBIx::Classで、複数テーブルをまたいでjoinする


DBIx::Classを使用しており、ARの機能を使って、あるテーブルから複数テーブルをまたいでjoinする方法です。

テーブル構成

下記のようなテーブル構成だったとします。

  • apps: アプリ情報
  • users: アプリを保持するユーザ情報
  • agencies: ユーザを管理する代理店情報

データ間の紐付き

こんな感じで紐づいています。

  • apps.user_id -> users.id
  • users.agency_id -> agencies.id

ARの設定

各モデルには上記のデータの紐付きを下記のように設定しています。

apps

__PACKAGE__->belongs_to(
    user => 'Users',
    { 'foreign.id' => 'self.user_id' }
);

users

__PACKAGE__->belongs_to(
    agency => 'Agencies',
    { 'foreign.id' => 'self.agency_id' }
);

やりたいこと

agencies.idでappsの一覧を取得したい。

具体的なコードはこんな感じになりました。

my $rs = $apps_model->search( 
    # conditions
    {
        'me.agency_id' => [検索条件の入力値]
    },
    # attributes
    {
        join => { user => [qw/agency/] }
    }
);

関連記事