2016-09-02 11 views
-3

私はこのquestionからこのmysqlクエリを持っています。相当のDBIx :: Class構​​文?

SELECT a.* 
FROM products a 
INNER JOIN product_tags b ON a.product_id = b.product_id 
WHERE b.tag_id IN (1,23,54) 
GROUP BY a.product_id 
HAVING COUNT(1) = 3 

私はこれをDBIx::Classの構文に変換する方法を理解しようとしていますか?

DBIx docsから、これは結合に関することですが、どのように組み込むのかわかりません。

定義ジョインおよび関係DBIx ::クラスにおいて^

2つのテーブル間の各関係は、最初のテーブルのResultSourceで定義する必要があります。関係を両方向でアクセスする必要がある場合(つまり、CDの全トラックをフェッチし、トラックのCDデータをフェッチする場合)、両方のテーブルに対して関係を定義する必要があります。 CDの

/例を追跡し、それははMySchemaで、書き込みを意味:: CD:

MySchema::CD->has_many('tracks', 'MySchema::Tracks'); 

とはMySchema ::トラックに:

MySchema::Tracks->belongs_to('cd', 'MySchema::CD', 'CDID'); 

の関係の他のいくつかの種類があります、 DBIx :: Class :: Relationshipでより包括的に記述されています。 ジョインを使用する^

すべてのリレーションシップを定義したら、それらのリレーションシップを実際のジョインで使用すると、非常に簡単です。あなたが選んだ関係のタイプ。 has_manyは、すでに実行されている結合の種類を示します。 has_manyはLEFT JOINを生成します。これは、右側に一致する行(結合先の表)があ​​るかどうかにかかわらず、左側のすべての行をフェッチします。あなたの関係に他のタイプの結合を強制することができます.DBIx :: Class :: Relationshipドキュメントを参照してください。

検索や検索操作のいずれかを実行するとき、あなたはこのように、参加属性を使用して、またに基づいて検索結果を絞り込むためにどの関係を指定することができます:あなたがのほとんどを認識しない場合は

$schema->resultset('CD')->search(
    { 'Title' => 'Funky CD', 
     'tracks.Name' => { like => 'T%' } 
    }, 
    { join  => 'tracks', 
     order_by => ['tracks.id'], 
    } 
); 

この構文では、DBIx :: Class :: ResultSetの "search"とDBIx :: Class :: ResultSetの "ATTRIBUTES"を読むべきですが、ここで簡単に説明します:

検索の最初の引数は、 WHERE属性のhashref、この場合はCDテーブルのTitle列の制限、Tracks表のトラック名の制限bu選択されたCDに実際に関連するトラックの場合に限ります。 2番目の引数は検索の属性のハッシュリファレンスで、結果は関連するトラックのIDでソートされて返されます。

+0

こんにちはabraあなたは何か提案がありますか?あなたはDBIxで働いていますか?あなたはDBIxを知っていますか?あなたのお友達の誰かがDBIxを知っていますか? plは彼らにこの質問を示します。 – rajeev

+0

DBIxはDBIx :: Classが1つのモジュールにすぎない完全な名前空間です。 DBIx :: Classの略語はDBICです。 –

答えて

2

まずは、製品のタグにrelを定義します。

MySchema::Result::Product->has_many(
    'tags', 'MySchema::Result::ProductTag', 'product_id' 
); 

Thneタグから製品のRELを定義します。

MySchema::Result::ProductTag->belongs_to(
    'products', 'MySchema::Result::Product', 'product_id' 
); 

あなたが途中でスキーマ::ローダーを使用していた場合、これらはすでに推測されていたであろう。

$schema->resultset('Product')->search({ 
    tags.tag_id => { -in => [1,23,54] }, 
}, { 
    join => 'tags', 
    group_by => 'me.product_id', 
    having => { 'count 1' => 3 }, 
}) 
:今

あなたの元のクエリを複製する:(恥知らずなプラグは、上記DBIx ::クラス::キャンディとDBIx ::クラス::ヘルパー::行:: RelationshipDWIMと短く、甘いでしょう)

+0

が承認され、アップが投票されました。あなたの時間のためのthxとFrewを助ける。明らかにDBIxについての知識はなく、ダウン投票して評価する準備が整っている多くのサイト管理者にとっては何倍も優れています。 – rajeev

関連する問題