2012-07-26 58 views
0

我正在CakePHP中构建一个站点。我有两个表,“类别”和“公司”和第三个是加入他们所谓的“companies_categories”:CakePHP 2.0 - 基于关系表的订单

companies_categories 
`id` int(10) NOT NULL AUTO_INCREMENT, 
`company_id` int(10) NOT NULL, 
`category_id` int(10) NOT NULL, 

我想基于公司在类别数量列出前10个类别,但我不知道如何去做。

这里是我的模型:

class Company extends AppModel { 
    public $name = 'Company'; 
    var $hasAndBelongsToMany = array(
     'Category' => 
      array(
       'className' => 'Category', 
       'joinTable' => 'companies_categories', 
       'foreignKey' => 'company_id', 
       'associationForeignKey' => 'category_id', 
       'unique' => true, 
       ) 
     ); 
} 

class Category extends AppModel { 
    public $name = 'Category'; 
    public $useTable = 'categories'; 

    // Set up the relationships 
    var $hasAndBelongsToMany = array(
     'Company' => 
      array(
       'className' => 'Company', 
       'joinTable' => 'companies_categories', 
       'foreignKey' => 'category_id', 
       'associationForeignKey' => 'company_id', 
       'unique' => true, 
      ) 
    ); 
}  

回答

0

你可以尝试以下方法:

$this->Category->find('list', array(
    'joins' => array(
     'table' => 'companies_categories', 
     'alias' => 'CompaniesCategory', 
     'type' => 'LEFT', 
     'foreignKey' => false, 
     'conditions' => 'Category.id = CompaniesCategory.category_id', 
    ), 
    'order' => 'COUNT(CompaniesCategory.id) DESC', 
    'group' => 'Category.id', 
    'limit' => 10, 
)); 

你可能想看看counterCache,然后将一个company_count字段添加到您categories表,你可以只是做:

$this->Category->find('list', array('order' => 'company_count DESC', 'limit' => 10)); 
+0

我忘了提及,我不能使用counterCache作为顶部10个类别列表取决于用户来自400多个城市的列表所在的城市。 – 2012-08-08 20:50:56

+0

那么第一部分仍然适用。不需要counterCache – tigrang 2012-08-08 20:52:18