带有连接表字段排序的 Cakephp 分页不起作用
Posted
技术标签:
【中文标题】带有连接表字段排序的 Cakephp 分页不起作用【英文标题】:Cakephp pagination with join table field sort is not working 【发布时间】:2013-06-03 21:11:56 【问题描述】:使用连接表排序的 Cakephp 分页不适用于连接表字段。但是对于自定义 sql 连接查询工作正常。请帮我出来。
请参见下面的示例代码。我按顺序将 Artist.name 加入表字段。
$this->paginate = array(
'fields' => array(
'id',
'Song.title',
'Song.date',
'Artist.id AS artist_id',
'Artist.name AS artist_name',
'COUNT(SongViews.id) AS views'
),
'group' => array('ArtistsSong.song_id'),
'recursive' => 0,
'limit' => 20,
'joins' => array(
array(
'table' => 'tbl_artists_songs',
'alias' => 'ArtistsSong',
'conditions'=> array('Song.id = ArtistsSong.song_id')
),array(
'table' => 'tbl_artists',
'alias' => 'Artist',
'conditions'=> array('Artist.id = ArtistsSong.artist_id')
),array(
'table' => 'tbl_song_views',
'alias' => 'SongViews',
'type' => 'left',
'conditions'=> array('SongViews.song_id = ArtistsSong.song_id')
),
),
'order' => array('Artist.name'=>'asc')
);
【问题讨论】:
...出来什么?请提供一些代码并更好地解释您想要的东西,很难用两行“问题”提供帮助 我添加了示例代码。检查。谢谢 【参考方案1】:这是 CakePHP 中的一个错误。
但是,有一个技巧可以做到。
您应该在主模型中添加一个虚拟字段。
假设你的主要模型是 Song,你应该在调用 paginate 之前添加这个:
$this->Song->virtualFields = array(
'artist_name' => 'Artist.name'
);
现在,您可以按artist_name
排序。
【讨论】:
您不能使用虚拟字段进行排序。阅读 CakePHP 手册 - book.cakephp.org/2.0/en/models/… 它可以很好地用于按字段排序。这对我来说是一个帮助 这是一个救命稻草,在排序和分页方面工作完美,谢谢!【参考方案2】:这个问题是近 5 年前提出的,但我在 CakePHP 3 中遇到了同样的问题。我意识到我需要将该字段列入白名单以允许排序:
$this->paginate = array(
...
'sortWhitelist' => array ('Artist.name')
);
Paginator 会自动将原始表中的字段列入白名单,但不会将 JOINed 表中的字段列入白名单。
【讨论】:
sortWhiteList 应该写成 sortWhitelist, -- 小写 'l' -- 从你那里复制过来,我们花了两个小时才弄清楚出了什么问题 抱歉,我已经更新了答案,不知道它是如何潜入其中的。【参考方案3】:$this->paginate = ['fields' => ['id', 'name', 'company_id'],
'contain' => [
'Companies' =>
[
'fields' => ['id', 'name'],
'sort'=>['name'=>'ASC']
]
'limit' => 10,
];
【讨论】:
虽然这个答案可能是正确且有用的,但最好在其中附上一些解释来解释它如何帮助解决问题。如果有更改(可能不相关)导致它停止工作并且用户需要了解它曾经是如何工作的,这在未来变得特别有用。【参考方案4】:在关联模型中按列排序需要设置sortWhitelist
。
$this->paginate['order'] = [ 'Artist.name' => 'desc' ];
$this->paginate['sortWhitelist'] = ['Artist.name', 'Song.title'];
$this->paginate['limit'] = $this->paginate['maxLimit'] = 200;
在 html 中,您必须在表头中设置以下行:
<?= $this->Paginator->sort('Song.title', __('Title')) ?>
【讨论】:
以上是关于带有连接表字段排序的 Cakephp 分页不起作用的主要内容,如果未能解决你的问题,请参考以下文章