2013-02-17 77 views
2

在我的应用程序中,我有一个Burger模型,一个Joint模型和一个Location模型。在CakePHP中使用关联关联条件进行过滤

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

我想要做的是过滤汉堡两种方式:基于评级,也取决于它们是否属于具有与条件相匹配的位置的联合,在此情况下为城市。

下面是我尝试过,但她没有workey:

$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); 

回答

2

问题:

这是一个很常见的问题的人有,但很容易,只要你明白反对它包含的项目,你不能限制基于条件的主要发现模型弥补。

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

解决方案:

你在这种情况下,最好的办法是使用CakePHP JOINs

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

+0

你的答案帮助!我在问题中添加了我的解决方案。它正在工作,但我不确定的一件事是我是否需要“包含”来实际将数据包含在结果中。 – 2013-02-18 00:44:05

+0

@BenjaminAllison - 你根本不应该使用包含 - 只需指定从不同模型'fields'=> array(...')所需的字段,它将返回你想要的数据 – Dave 2013-02-18 03:39:09

+0

但是当然!非常感谢。 – 2013-02-18 05:48:01