CakePhp 2.0使用Pagination / Paginator对相关模型进行排序

时间:2012-07-14 21:39:57

标签: cakephp-2.0

我意识到这个问题几乎遍布StackOverflow,但没有一个答案对我有用。

我的问题很简单。我只想列出按城市名称订购的公司:

class Company extends AppModel
 public $recursive = 2;

 public $belongsTo = array(
 'City' => array(
  'className'    => 'City',
   'foreignKey'   => 'city_id'
  )
 );

class City extends AppModel {
 public $useTable = 'cities';

 public $belongsTo = 'Country';
 public $hasMany = array(
  'Company' => array(
    'className'    => 'Company',
    'foreignKey'   => 'city_id'
 )
);

在公司页面上,从而在公司控制器内,我想做这样的事情:

$this->paginate = array(
 'order' => array('Company.City.name' => 'ASC' ),
 // or is it 'order' => array('Company->City.name' => 'ASC' ), ??
);
$companies = $this->paginate('Company');

在视图中,有一个链接可以按城市名称更改排序:

<?php echo $this->Html->link(__('Sort by City name'), array('controller' => 'companies', 'action' => 'index', '?' => array('sort' => 'Company.City.name'))); ?> 

当我建立一个链接以通过公司模型中的字段更改订单时,例如名称(公司名称),我建立如下链接:

<?php echo $this->Html->link(__('Sort by Company name'), array('controller' => 'companies', 'action' => 'index', '?' => array('sort' => 'Company.name'))); ?> 

......它运作正常。所有Pagination链接,如第一个,下一个,数字等,也可以工作,并创建这样的链接:

本地主机/公司/ 20 /排序:Company.name/page:2

那么我在世界上如何为Company.City.name做这个(当我在它时,Company.City.Country.name!)目前它似乎忽略了我的'sort'参数。如果我打开调试,当我尝试按Company.City.name订购时,生成的SQL查询没有'order by'子句。

这让我感到疯狂,这似乎是一件足够简单的事情。非常感谢,非常感谢!

更新:嘿!那很有效!或者至少,我在中途!我能够在我的控制器中使用你的建议:

$this->paginate = array(
  'limit' => 10,
  'order' => array('City.name' => 'ASC' )
);

它有效!现在我正在尝试为Country做同样的事情,它不起作用。我试过了:

$this->paginate = array(
      'limit' => 10,
      'order' => array('City.Country.name' => 'ASC' )
    );

$this->paginate = array(
      'limit' => 10,
      'order' => array('City->Country.name' => 'ASC' )
    );

没有爱。它忽略了我的'order'参数。关于如何做到这一点的任何想法?

再次感谢您的回答。

1 个答案:

答案 0 :(得分:3)

如果您定义了模型关联船,则不需要使用Company.City.name等。您可以直接使用City.name。

如果您要显示列表,那么您可以使用以下代码,而不是提供要对表数据进行排序的链接。

<?php echo $this->Paginator->sort('City.name', 'City Name');?>

请问它是否对您不起作用。