15

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

    );
4

4 回答 4

20

这是 CakePHP 中的一个错误。

但是,有一个技巧可以做到这一点。

您应该在主模型中添加一个虚拟字段。

假设你的主要模型是 Song,你应该在调用 paginate 之前添加这个:

$this->Song->virtualFields = array(
    'artist_name' => 'Artist.name'
);

现在,您可以按artist_name.

于 2013-08-05T14:00:38.337 回答
2

大约 5 年前有人问过这个问题,但我在 CakePHP 3 中遇到了同样的问题。我意识到我需要将该字段列入白名单以允许排序:

$this->paginate = array(
    ...
    'sortWhitelist' => array ('Artist.name')
);

Paginator 会自动将原始表中的字段列入白名单,但不会将 JOINed 表中的字段列入白名单。

于 2018-05-09T10:45:22.550 回答
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')) ?>
于 2020-11-23T08:28:54.513 回答
0
$this->paginate = ['fields' => ['id', 'name', 'company_id'],
                'contain' => [
                            'Companies' =>
                                 [
                                    'fields' => ['id', 'name'],
                                     'sort'=>['name'=>'ASC']
                                 ]
                'limit' => 10,

            ];
于 2018-05-09T11:15:31.597 回答