我使用CakePHP 2.2.2 我有3张桌子:餐馆,厨房和厨房餐厅 - HABTM的连接桌。
在餐厅模特中,我有:
public $hasAndBelongsToMany = array(
'Kitchen' =>
array(
'className' => 'Kitchen',
'joinTable' => 'kitchens_restaurants',
'foreignKey' => 'restaurant_id',
'associationForeignKey' => 'kitchen_id',
'unique' => true,
'conditions' => '',
'fields' => 'kitchen',
'order' => '',
'limit' => '',
'offset' => '',
),
问题是我的主页面有单独的控制器,我需要从复杂条件的模型中检索数据。
我添加了
public $uses = array('Restaurant');
到我的主页控制器,这里是我需要你建议的部分。
我只需要选择那些厨房= $ id的餐馆。 我试图添加
public function index() {
$this->set('rests', $this->Restaurant->find('all', array(
'conditions' => array('Restaurant.active' => "1", 'Kitchen.id' => "1")
)));
}
我得到了SQLSTATE [42S22]:未找到列:1054“where子句”错误中的未知列。 显然我需要从“HABTM连接表”中获取数据,但我不知道如何。
答案 0 :(得分:24)
<强> TLDR:强>
要检索根据[ HABTM ]关联条件限制的数据,您需要使用[ Joins ]。
<强>解释强>
下面的代码遵循[ Fat Model/Skinny Controller ]咒语,因此逻辑大部分都在模型中,只是从控制器调用。
注意:如果您遵循[ CakePHP conventions ](您看来是这样),则不需要所有这些HABTM参数。
下面的代码尚未经过测试(我在这个网站上写过),但它应该非常接近,至少能让你朝着正确的方向前进。
<强>代码:强>
//餐厅模特
public $hasAndBelongsToMany = array('Kitchen');
/**
* Returns an array of restaurants based on a kitchen id
* @param string $kitchenId - the id of a kitchen
* @return array of restaurants
*/
public function getRestaurantsByKitchenId($kitchenId = null) {
if(empty($kitchenId)) return false;
$restaurants = $this->find('all', array(
'joins' => array(
array('table' => 'kitchens_restaurants',
'alias' => 'KitchensRestaurant',
'type' => 'INNER',
'conditions' => array(
'KitchensRestaurant.kitchen_id' => $kitchenId,
'KitchensRestaurant.restaurant_id = Restaurant.id'
)
)
),
'group' => 'Restaurant.id'
));
return $restaurants;
}
//任何控制器
public function whateverAction($kitchenId) {
$this->loadModel('Restaurant'); //don't need this line if in RestaurantsController
$restaurants = $this->Restaurant->getRestaurantsByKitchenId($kitchenId);
$this->set('restaurants', $restaurants);
}
答案 1 :(得分:2)
有比Dave提供的解决方案更清晰的方法。
首先,您需要在 Kitchen 模型中 Restaurant 和 Kitchen 之间设置反向HABTM关系。 < / p>
您只需为您感兴趣的 Kitchen (id = 1)创建查找,然后使用Containable Behavior获取关联的餐馆通过餐厅字段过滤。
System.out.println("cache.contain should return true if entity exists in cache: "+cache.contains(Order.class, order.Id()));
答案 2 :(得分:1)
您不需要使用[加入],因为使用了设置[HABTM]的关联
厨房模型hasAndBelongsToMany餐厅模型,以便您可以编码如下:
KitchensControllers
<?php
public function index() {
$this->Kitchen->recursive = 0;
$kitchens = $this->Kitchen->find('all', array('contain' => array('Restaurant')));
$this->set('kitchens', $kitchens);
}
?>
祝你好运!