2012-01-20 5 views
3

私たちのMySQLデータベースでは、third_party_accountsというテーブルとhas_manythird_party_campaignsというテーブルがあります。ただし、すべてのアカウントにキャンペーンがあるわけではありません。 DBIx::Classで何をしたいのですか?1つ以上のキャンペーンを持つアカウントのみを選択します。最も単純には私が見つけたました、次のとおりです。関連するデータベース列の場合DBIx :: Class:0より大きいhas_manyの結果を選択してください

my $third_party_account_rs = $schema->resultset('ThirdPartyAccount'); 
my $with_campaigns_rs  = $third_party_account_rs->search(
    { third_party_account_id => \'IS NOT NULL' }, 
    { 
     join  => 'third_party_campaigns', 
     group_by => 'me.id',                                 
    } 
); 

mysql> select id from third_party_accounts; 
+----+ 
| id | 
+----+ 
| 1 | 
| 2 | 
| 3 | 
+----+ 
3 rows in set (0.00 sec) 

mysql> select id, third_party_account_id from third_party_campaigns; 
+----+------------------------+ 
| id | third_party_account_id | 
+----+------------------------+ 
| 1 |      1 | 
| 2 |      2 | 
| 3 |      1 | 
+----+------------------------+ 
3 rows in set (0.00 sec) 

これは私が行うための簡単な方法があります確信している、このような明白なユースケースのように思えますしかし、私はそれを見つけることができません。

答えて

5
my $with_campaigns_rs = 
    $schema->resultset('ThirdPartyCampaigns') 
    ->search_related('third_party_account'); 
+1

これはすでに私には示唆されていますが、動作しません。私の元のクエリでは、私は 'group_by =>" me.id "を持っていたことに注意してください。これは 'ThirdPartyAccount'レコードの重複を防ぎます。上記のデータを持つこの「逆の」解決法は、idが1の2つの 'ThirdPartyAccount'オブジェクトを私に残すでしょう。 – Ovid

+1

返り値が重複しないようにするには、' - > search_relatedに '{distinct => 1} '呼び出し。 – ilmari

関連する問題