带有联接表字段排序的Cakephp分页不起作用

qmb5sa22  于 2021-06-26  发布在  PHP
关注(0)|答案(4)|浏览(167)

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')

    );
gopyfrb3

gopyfrb31#

这是CakePHP中的一个错误。
不过,有一个诀窍可以做到。
应在主模型中添加虚拟字段。
假设您的主模型是Song,您应该在调用paginate之前添加以下内容:

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

现在,您可以按artist_name排序。

zqry0prt

zqry0prt2#

这个问题在5年前就被提出了,但我在CakePHP 3中遇到了同样的问题。我意识到我需要将字段列入白名单,以便进行排序:

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

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

xggvc2p6

xggvc2p63#

$this->paginate = ['fields' => ['id', 'name', 'company_id'],
                'contain' => [
                            'Companies' =>
                                 [
                                    'fields' => ['id', 'name'],
                                     'sort'=>['name'=>'ASC']
                                 ]
                'limit' => 10,

            ];
o0lyfsai

o0lyfsai4#

按关联模型中的列排序需要设置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')) ?>

相关问题