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 并用满足上述状态条件的活动和 ivrnumber 填充 mkting_campaigns。但我只想要满足上述条件的 mkting_campaigns(不是所有 mkting_campaigns)

我这里有两个解决方案

  1. 我可以改用连接。但这是一个好习惯吗?
  2. 我必须对结果实施一些逻辑来过滤不需要的结果,mkting_Campaigns但是没有更好的方法来修改查询以仅获得所需的结果吗?

请帮忙

谢谢

4

1 回答 1

0

首先,Containable不加入hasMany。您可以将条件绑定hasMany为 ahasOne并将数据保留为可包含。

查询前

$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 回答