2011-03-22 67 views
0

我有一个CakePHP的1.2应用中的以下模型:CakePHP的分页与第三级车型

class Equipment extends AppModel { 

     var $name = 'Equipment'; 
     var $belongsTo=array("City"); 
    /// 
} 

我的城市模型是这样的:

class City extends AppModel { 

    var $name = 'City'; 
    var $belongsTo=array("State"); 
    /// 
} 

我什么也没做特别在EquipmentController中 - 只需使用Paginator即可获得所有设备。

所以,当我尝试实施这样的观点分页:

<th><?php echo $paginator->sort('Equipment',"Equipment.name");?></th> 
    <th><?php echo $paginator->sort('City',"City.name");?></th> 
    <th><?php echo $paginator->sort('State',"State.name");?></th> 

我可以通过设备名称和城市名称的排序,而是由国家名排序由City.id给了我一个排序列表 - 不是State.name。我试过使用City.State.name,但那给了我相同的结果。我已将两个模型的“递归”属性更改为“2”,结果相同。

   ); 

为什么这不起作用?任何人都可以给我一个解决方法或告诉我我做错了什么?

编辑我忘了说我试过Containable,它也没有工作。这是我如何设置它:

$this->paginate = array(
    "conditions" => array("Equipment.expire_time >"=>date("Y-m-d H:i:s"), 
     "Equipment.is_active"=>true 
         ), 
    'limit' => 25,   
    'order' => array(
     'Equipment.available_time' => 'asc', 

     ), 
     'contain'=>array(
      "City"=>array(
       "fields"=>array("id","name"), 
       "State"=>array("fields"=>"name")), 

      ) 

而且我看到正确的查询运行,但仍可以通过国家排序

回答

0

蛋糕不加入表中的所有时间像一些SQL通常会做,而不是它执行select操作,然后foreach从一个查询中读取行,并为循环的每次迭代执行查找操作。

安装类似调试工具包的东西,以便您可以看到正在执行的SQL。如果在谷歌上搜索“cakephp深入发现”,有几种方法可以做到这一点,其中之一是强迫hasOne加入关系。

Cake可能正在加载相关模型的AppModel实例。你可以用pho方法get_class iirc来检查它。确保没有任何应用模型,它应该都是您创建的实际类。

如果没有太多查询,您需要调查您创建的关系。 (虽然怀疑这一点,其他2更可能的原因)

编辑... How do I filter deep associations in CakePHP

+0

我已经有了SQL调试运行和运行它的右侧查询。当我打开Containable时,我看到正在运行的大型“连接”查询,然后是其他查询来获取州名 - 就像我想的那样。 – MikeHoss 2011-03-23 02:16:23