使用连接表排序的Cakephp分页对连接表字段不起作用。但是对于自定义sql join查询工作正常。请帮我出来。
请参阅下面的示例代码..我按顺序拥有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')
);
答案 0 :(得分:19)
这是CakePHP中的一个错误。
但是,有一个技巧可以做到。
您应该在主模型中添加虚拟字段。
假设你的主要模型是Song,你应该在调用paginate之前添加它:
$this->Song->virtualFields = array(
'artist_name' => 'Artist.name'
);
现在,您可以按artist_name
排序。
答案 1 :(得分:0)
这个问题在大约5年前被问过,但是我在CakePHP 3中遇到了同样的问题。我意识到我需要将该字段列入白名单以便进行排序:
$this->paginate = array(
...
'sortWhiteList' => array ('Artist.name')
);
Paginator会自动将原始表中的字段列入白名单,但不会从JOINed表中白名单。
答案 2 :(得分:0)
$this->paginate = ['fields' => ['id', 'name', 'company_id'],
'contain' => [
'Companies' =>
[
'fields' => ['id', 'name'],
'sort'=>['name'=>'ASC']
]
'limit' => 10,
];
答案 3 :(得分:0)
按关联模型中的列排序需要设置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')) ?>