Cakephp - 试图模拟一个简单的SQL查询,涉及3个表和2个条件的连接

时间:2013-01-18 13:56:22

标签: cakephp

我有3个模特

  1. MktingCampaign
  2. Campaign
  3. IvrNumber
  4. MktingCampaign hasMany CampaignCampaign hasOne 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;
    

    它的作用是获取campaigns.status = 1 and ivr_numbers.status = 0

    的mkting_campaigns

    我写了这个,

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

    返回所有mkting_campaigns并使用满足上述状态条件的广告系列和ivrnumbers填充mkting_campaigns。但我只想要满足上述条件的mkting_campaigns(并非所有mkting_campaigns)

    我这里有两个解决方案

    1. 我可以使用联接。但这是一个好习惯吗?
    2. 我必须在结果上实现一些逻辑来过滤不需要的mkting_Campaigns,但是没有更好的方法来修改查询以获得所需的结果吗?
    3. 请帮忙

      由于

1 个答案:

答案 0 :(得分:0)

首先,Containable不加入hasMany。您可以将hasMany绑定为条件的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,只会获取包含相关数据的行。