CakePHP - SQL:连接表

时间:2012-01-04 15:01:42

标签: mysql cakephp join

我有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')调用来获取以下信息:

  1. 商店记录本身。
  2. 各商店的商店经理。
  3. 每家商店的城市记录。
  4. 商店记录本身。
  5. userscities表与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
    

2 个答案:

答案 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