1

データベースに 2 つのテーブルがあり、そのうちの 1 つが Accounts テーブルに関連付けられています。

そのため、Account.pm のスキーマ結果に次の行を追加しました。

__PACKAGE__->has_many('subjects', 'MyApp::DBIC::Schema::Subject', {'foreight.account_id' => 'self.account_id'});

次に、コントローラーでこのような検索を行います。

$c->stash->{search_results} = $c->model('DB::Account')->search(
{ -or => [
   firstname => {like => '%'.$search_term.'%'},
   'subjects.subject_title' => {like => '%'.$search_term.'%'},
 ]
},
{
 join => 'subjects',
 rows => '3',
},
{
 order_by => 'first name ASC',
 page => 1,
 rows => 10,
}
);

エラーは出力されませんが、ビュー ファイルに結果を出力する方法がわかりません。これは、2 つのテーブル間の関係を作成する正しい方法ですか?

私の目標: を提供しsearch_term、2 つのテーブルを検索し、結果をビュー ファイルに出力します。私のSQLは次のようになります。

SELECT FROM Accounts,Subjects WHERE Accounts.firstname=$search_term OR Subjects.subject_title=$search_term LEFT JOIN Subjects ON Accounts.account_id=Subject.account_id

上で述べたように、結果をビューファイルに出力したいと思います。

私は Perl にかなり慣れていないので、ドキュメントのいくつかはまだあまり意味がありません。そのため、ヘルプやヒントをいただければ幸いです。

4

2 に答える 2

3

結合は私には問題ないように見えますが、結合なしで単純化されたバージョンを試して、他のすべてが問題ないことを確認することは理にかなっています。

の動作は、DBIx::Class::ResultSet::search呼び出されたコンテキストによって異なります。リスト コンテキストで呼び出された場合は、データベース クエリを実行し、オブジェクトの配列を返しMyApp::DBIC::Schema::Accountます。例えば:

my @accounts = $c->model('DB::Account')->search();

あなたの場合search、スカラーコンテキストで呼び出しています。つまり、配列を返すのではなく、DBIx::Class::ResultSetオブジェクト (またはそのサブクラス) を返します。重要なことに、実際には db クエリを実行しません。allそのためには、結果セットでメソッドを呼び出す必要があります。したがって、デフォルトのテンプレート ツールキット ビューを使用していると仮定すると、おそらく次のようなものが必要になります。

[% FOREACH search_result IN search_results.all %]
    [% search_result.first_name %]
[% END %]

DBIx::Class のこの「怠惰な」動作は、実際には非常に便利であり、私の意見では、ドキュメンテーションではいくらか過小評価されています。これは、結果セットを変数に保持し、実際に DB にアクセスすることなく、さまざまな検索呼び出しを実行し続けることができることを意味します。複雑なクエリを条件付きで構築したい場合には、はるかに優れたコードを使用できます。詳細については、DBIx::Class::Resultsetのドキュメントを参照してください。

于 2013-04-22T08:33:45.830 に答える
2

クエリにエラーがあります:

試す:

$c->stash->{search_results} = $c->model('DB::Account')->search(
  { -or => [
      firstname => {like => '%'.$search_term.'%'},
      'subjects.subject_title' => {like => '%'.$search_term.'%'},
    ]
  },
  {
    join => 'subjects',
    order_by => 'firstname ASC',
    page => 1,
    rows => 10,
  }
);
于 2013-04-24T07:29:07.203 に答える