我有4张桌子:
stores {id, name, owner_id, city_id, ...}
store_managers {id, store_id, user_id, ...} // since I'm not associating (i have my reasons) the table to the others by cake's association, the name is not by the cakePHP naming conventions.
cities {id, name, ...}
users {id, name, ...}
现在..在stores_controller
中有一个名为'stores_stats()'的函数,它收集有关用户拥有的商店的一些统计信息并显示它。 owner_id来自$this->Auth->user('id')
我想使用$this->Store->find('all')
调用来获取以下信息:
users
和cities
表与stores
表关联,find('all')
查询正确返回有关它们的数据。我的问题在于store_managers
表。
如何将store_managers
加入查询?
而且,只是为了正确 - 我如何自己编写这样的查询?
以下查询给了我一些东西..其他..
SELECT *
FROM stores
LEFT JOIN cities ON stores.id = cities.id
LEFT JOIN store_managers ON store_managers.store_id = stores.id
WHERE stores.id = 122 AND stores.owner_id = 3
答案 0 :(得分:1)
您可能想要使用CakePHP的可包含行为。 (read more about it here)。
//Store Model
class Store extends AppModel {
var $actsAs = array('Containable');
//associations
//validation
//the method you call from the controller
function getStoreStats() {
$this->recursive = -1;
$params = array();
$params['containable'] = array(
'User' => array(
'StoreManager',
),
'City'
);
$data = $this->find('all', $params);
return $data;
}
}
我们的想法是,您将递归设置为-1
,这会将您从商店返回的数据限制为自身。然后,使用containsable,指定要返回的其他相关数据。
确保您是否正在阅读CakePHP图书以验证您是否使用了正确的版本(1.3,2.0等)。
此外,在应用模型中设置$this->recursive=-1;
非常常见,这是所有人的默认设置。
假设您的所有关系都设置正确,并且它们都不是HABTM关系,那么Containable应该对您有用。
答案 1 :(得分:0)
CakePHP解决方案将实现与商店模型的关系。如果有许多商店经理,您可以将此代码放入商店模型中:
$hasMany = array(
'StoreManagers' => array( 'className' => 'StoreManagers')
);
或者,如果只有一个商店经理:
$hasOne = 'StoreManagers';
如果您遵守命名约定,则find()调用应返回数组,其中每个商店应为“StoreManagers”项(或数组),其中将提取所有链接的项。
有关加入表格的更多信息,请参阅here