过滤CakePHP中关联关联的条件

时间:2013-02-17 21:59:09

标签: cakephp associations

在我的应用中,我有Burger模型,Joint模型和Location模型。

关节有很多汉堡,并且有许多地点。

我想要做的是过滤Burgers两种方式:基于评级,还基于它们是否属于具有匹配条件的位置的联合,在这种情况下是城市。

这是我尝试过的,但她没有烦恼:

$burgers = $this->Burger->find('all', array(
    'conditions' => array('Burger.official_rating !=' => 0),
    'contain' => array(
        'Joint',
            'Joint.Location.conditions' => array(
                'Location.city' => 'Toronto'
            )
    ),
    'order' => array('Burger.official_rating DESC'),
    'limit' => 10
));

Joint.Location.conditions似乎没有效果。

编辑:现在使用连接,但我不确定这是否是最有效的方式(注意,我必须添加一个Contain子句,以确保在结果中返回关联的数据)。

$options['joins'] = array(
    array('table' => 'joints',
        'alias' => 'Joint1',
        'type' => 'inner',
        'conditions' => array(
            'Joint1.id = Burger.joint_id'
        )
    ),
    array('table' => 'locations',
        'alias' => 'Location2',
        'type' => 'inner',
        'conditions' => array(
            'Location2.joint_id = Burger.joint_id'
        )
    )
);

$options['conditions'] = array(
    'Location2.city' => 'Toronto',
    'Burger.official_rating !=' => 0
);

$options['order'] = array(
    'Burger.official_rating DESC',
);

$options['limit'] = 10;

$options['contain'] = array(
    'Joint','Joint.Location'
);

$burgers = $this->Burger->find('all', $options);

1 个答案:

答案 0 :(得分:2)

<强>问题:

这是一个人们非常普遍的问题,但只要你明白你不能根据条件对其包含的项目限制主查找模型,就可以很容易地解决这个问题。

您不能这样做的原因是因为执行包含实际上会在表上创建单独的查询,而不是JOIN,这会创建单个查询。

<强>解决方案:

在这种情况下,最好的选择是使用CakePHP JOINs

在某些情况下(不是你的),使用JOIN的替代方法是更改​​您正在进行查询的模型。如果您只需要一个条件,那么您可以使用条件而不是包含中的条件将查找更改为模型,并以相反的顺序包含。