0

私は3つのモデルを持っています

  1. MktingCampaign
  2. Campaign
  3. IvrNumber

MktingCampaignhasManyCampaignCampaignhasOne IvrNumber

このクエリをエミュレートしようとしています -

select * from mkting_campaign 
join campaign on mkting_campaign.id = campaign.mkting_campaign_id 
join ivr_numbers on campaign.id = ivr_numbers.campaign_id 
where campaign.status = 1 and ivr_numbers.status = 0;

それがすることは、mkting_campaigns を取得することですcampaigns.status = 1 and ivr_numbers.status = 0

私はこれを書いた、

$this->MktingCampaign->find('all',array(
    'contain' => array(
        'Campaign' => array(
            'conditions' => array('Campaign.status' => 1), 
            'IvrNumber' => array(
                'conditions' => array(
                    'IvrNumber.status' => 0
                )
            )
        )
    )
));

すべての mkting_campaigns を返し、mkting_campaigns に上記のステータス条件を満たすキャンペーンと ivrnumbers を入力します。ただし、上記の条件を満たす mkting_campaigns のみが必要です (すべての mkting_campaigns ではありません)。

ここには2つの解決策があります

  1. 代わりに結合を使用できます。しかし、それは良い習慣ですか?
  2. 結果にロジックを実装して不要なものをフィルタリングする必要mkting_Campaignsがありますが、クエリを変更して目的の結果のみを取得するより良い方法はありませんか?

助けてください

ありがとう

4

1 に答える 1

0

まず、Containable参加しませんhasManyhasManyを条件用としてバインドhasOneし、データ用に包含可能のままにすることができます。

クエリの前に

$this->bindModel(array('hasOne' => array(....)));

クエリへの追加:

'contain' => array(
    'HasOneAliasFromAbove',
    ... other contains ....
),
'conditions' => array(
   'HasOneAliasFromAbove.field' => 'value'
)

次のような結合を与える関係に条件を直接追加することもできます

LEFT JOIN foo as Foo ON (... your conditions ...)

RIGHT JOINまたは、関連するデータを含む行のみをフェッチするようにすることもできます。

于 2013-01-18T14:19:33.173 に答える