4

Catalyst フレームワークで DBIx::Class を使用しています。私の局所的な目標は、ユーザーと、たとえばタスクとの間に新しい多対多の関係を追加することです。しかし、私が必要とする小さなトリックが 1 つあります。ユーザーは、タスク内でさまざまな役割を持つことができます (「作業者」や「見物人」など)。

だから私はこれらのフィールドを持つユーザーテーブルを持っています:

  • ID
  • 名前

これらのフィールドを持つタスクテーブルがあります:

  • ID
  • 題名
  • 説明

そして、これらのフィールドを持つリレーションシップ テーブルuser_tasksがあります。

  • ユーザーID
  • task_id
  • 役割

usersからuser_tasksへの has_many 、 tasks からuser_tasksの has_many 、およびuserstasks間の対応する many_to_many 関係を設定しました。そして、その単純な部分は正常に機能します。

次に、たとえば、$task_id で識別されるタスクでのユーザーの役割を含むユーザー リストを取得したいと考えています。

my $users = $schema->resultset('User')->with_task_role($task_id);
while (my $u = $users->next) {
    print "User: " . $u->name . ", role: " . $u->get_column('task_role');
}

では、このwith_task_roleカスタム結果セットをどのようにコーディングして、クエリでユーザーのタスク ロールを含むこの追加フィールドを取得する必要がありますか?

4

2 に答える 2

4

まず、多対多は関係ではありません。これはアクセサー (関係ブリッジ) です。

次に、DBIx::Class には優れたドキュメントがあります。結合/プリフェッチを見てください。ResultSet/User.pm ファイルには、次のようなものが含まれている必要があります。

sub with_task_role {
    my ($self, $task_id) = @_;

    return $self->search({
            'task.task_id' => $task_id,
        },
        {
            join     => { 'user_task' => 'task' },
            prefetch => { 'user_task' => 'task' },
        },
    );
}

PS: 申し訳ありませんが、Ashley が既に回答していることを確認できませんでした。

于 2011-05-24T15:50:30.780 に答える
2

これは、 DBIC マスター クラス(.xul リソース)Userの XUL (現在はどのブラウザーでもサポートされていません) スライドショーからの、変更されていない結果セット コードです。プレーン テキストとして問題なく読めるスライドをダウンロードして確認することを強くお勧めします。それらは、私にとって結果セットの大きな目を見張るものでした。

検索先の名前を独自の名前に合わせて調整する必要がありますが、これは必要なものであり、 _role_to_id役割オブジェクトまたは ID を渡すことができる で起動するのが少し柔軟になるはずです。

  sub with_role {
    my ($self, $role) = @_;
    $self->search({
        'role_links.role_id' => $role->id
      },
      { join => 'role_links' }
    );
  }

  sub _role_to_id {
    my ($self, $role) = @_;
    return blessed($role) ? $role->id : $role;
  }

  sub with_any_role {
    my ($self, @roles) = @_;
    $self->search({
        'role_links.role_id' => {
          -in => [
            map { $self->_role_to_id($_) } @roles
          ]
        }
      },
      { join => 'role_links' }
    );
  }
于 2011-05-24T15:34:26.937 に答える