我有3个模特
MktingCampaign
Campaign
IvrNumber
MktingCampaign
hasMany Campaign
和Campaign
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
。
我写了这个,
$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)
我这里有两个解决方案
mkting_Campaigns
,但是没有更好的方法来修改查询以获得所需的结果吗?请帮忙
由于
答案 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
,只会获取包含相关数据的行。