3

かなり基本的な DBIx-Class プリフェッチの使用法に苦労しています。プリフェッチが使用されている場合に、結合されたテーブルから返される列を制限したいと考えています。

これ:

my $rs = $schema->resultset('CD')->search(
  {}, # No searching restrictions through WHERE clause
  {
    prefetch => [qw/ artist /],
    columns  => [qw/ title artist.name /],
  }
);

次の SQL を生成します。

SELECT cd.title, artist.*
FROM cd
JOIN artist ON cd.artist = artist.id

ただし、すべてのアーティストの列を掘り下げたいわけではなく、cd.title 列と artist.name 列だけを掘り下げたいと思います (この例では、私の実際の使用例はもっと複雑です)。列機能は、結合されたテーブルではなく、プライマリ テーブルでのみ機能するようです。

私はこのSQLが欲しいです:

SELECT cd.title, artist.name
FROM cd
JOIN artist ON cd.artist = artist.id

私はちょうど Catalyst/DBIx-Class で海の足を手に入れているので、ここで目がくらむほど明白な何かを見落としている可能性があります!

4

3 に答える 3

3

はい、あなたは正しいです。プライマリ テーブルの列のみを選択でき、結合されたテーブルの特定の列を取得することはできません。必要なのは参加です。join と '+select','+as' プロパティを使用すると、2 つのテーブルから特別な列を選択できます。

プリフェッチは、プリフェッチ テーブルからすべての列を選択するためにも使用されます。これらの列が実際に必要な場合は、プリフェッチを使用する方が効率的です。たとえば、追加のクエリを実行する必要なく $cd->artist->name を実行できます。ただし、これらの列が必要ない場合は、そのデータをロードするために不必要にパフォーマンスが低下します。

于 2013-11-05T10:50:37.947 に答える
2

のバージョン 0.08250 ではDBIx::Class、列のサブセットのプリフェッチがサポートされています。joinと、次のように機能columnsする新しいcollapse属性を使用してクエリを記述できるようになりましたprefetch

my $rs = $schema->resultset('CD')->search(
  {},
  {
    join     => [qw/ artist /],
    columns  => [qw/ title artist.name /],
    collapse => 1,
  }
);
于 2013-11-14T01:24:41.583 に答える