使用连接表字段排序的Cakephp分页不起作用

时间:2013-06-07 14:10:39

标签: cakephp sorting join pagination

使用连接表排序的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')

    );

4 个答案:

答案 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')) ?>