Cakephp—尝试模拟一个简单的sql查询,该查询涉及3个表和2个where条件的联接

Cakephp—尝试模拟一个简单的sql查询,该查询涉及3个表和2个where条件的联接,cakephp,Cakephp,我有三种型号 MktingCampaign 活动 IvrNumber MktingCampaignhasManyCampaign和CampaignhasOneIvrNumber 我正在尝试模拟这个查询- select * from mkting_campaign join campaign on mkting_campaign.id = campaign.mkting_campaign_id join ivr_numbers on campaign.id = ivr_numbers.camp

我有三种型号

  • MktingCampaign
  • 活动
  • 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;
    
    它所做的是获取其
    活动.status=1和ivr\u number.status=0的营销活动

    我写了这个

    $this->MktingCampaign->find('all',array(
        'contain' => array(
            'Campaign' => array(
                'conditions' => array('Campaign.status' => 1), 
                'IvrNumber' => array(
                    'conditions' => array(
                        'IvrNumber.status' => 0
                    )
                )
            )
        )
    ));
    
    它将返回所有营销活动,并使用满足上述状态条件的营销活动和IVR编号填充营销活动。但我只想要满足上述条件的mkting_活动(不是所有mkting_活动)

    我这里有两个解决方案

  • 我可以用连接代替。但这是一种好的做法吗
  • 我必须在结果上实现一些逻辑来过滤不需要的
    mkting_活动
    ,但是没有更好的方法来修改查询以只获得所需的结果吗
  • 请帮忙


    谢谢

    首先,
    可包含的
    没有加入
    有很多
    。对于条件,您可以将
    hasMany
    绑定为
    hasOne
    ,并为数据保留containable

    在查询之前

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

    添加到您的查询:

    'contain' => array(
        'HasOneAliasFromAbove',
        ... other contains ....
    ),
    'conditions' => array(
       'HasOneAliasFromAbove.field' => 'value'
    )
    
    您还可以直接在关系中添加条件,这将为您提供类似的联接

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

    或者您可以将其设置为一个
    右连接
    ,它将只获取包含相关数据的行。

    这是一个好的做法吗?即使我在模型中指定了关联,我是否需要在每次我想加入时都绑定模型?绑定模型是一种动态创建关联的方法。本质上是一样的。您也可以在模型的$hasOne属性中执行此操作,尽管这是毫无意义的,因为您通常需要一些fk来加入,即使一个模型“有许多”另一个模型,仅出于查询目的,我是否需要将其设置为“hasOne”?下面是关于正在进行的操作的更多详细信息,谢谢!问题解决了,但看起来有点古怪和迂回的解决方案。我仍然没有明白这一点——为什么我要给虚假的关系来完成我的事情!