带有连接表字段排序的 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 分页不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Kendo UI Grid 上的分页不起作用

EXTJS 4 网格与分页不起作用---存储代理问题

CodeIgniter 3分页不起作用

为啥分页不起作用并在 wordpress 网站上出现 404 错误?

RecyclerView分页不起作用

ExtJs 网格分页不起作用