CakePHP分页 - 按虚拟字段排序

时间:2014-02-16 14:16:53

标签: php mysql cakephp

贡献者有歌曲和歌曲有贡献者。我希望能够根据贡献者的歌曲数量进行排序。

在我的控制器中:

public $paginate = array(
    'fields' => array(
        'Contributor.id',
        'Contributor.name',
        'COUNT(DISTINCT ContributorsSong.song_id) AS Contributor__TotalSongs',
    ),

    'joins' => array(
        array(
            'alias' => 'ContributorsSong',
            'table' => 'contributors_songs',
            'type' => 'LEFT',
            'conditions' => 'ContributorsSong.contributor_id = Contributor.id'
        ),
        array(
            'alias' => 'Song',
            'table' => 'songs',
            'type' => 'LEFT',
            'conditions' => 'ContributorsSong.song_id = Song.id'
        )
    ),

    'group'  => array('ContributorsSong.contributor_id')

);

在我的索引方法中。

    $this->Contributor->recursive = 0;
    $this->Paginator->settings = $this->paginate;
    $this->Contributor->virtualFields['TotalSongs'] = 0;

    $items = $this->paginate();

    echo '<pre>';print_r($items);echo '</pre>';

我正在尝试使用虚拟字段按歌曲数量排序,所以当我去

本地主机/站点/贡献者/索引/排序:TotalSongs /

我收到此错误:

  

错误:SQLSTATE [42S22]:未找到列:1054'order clause'中的未知列'0'

     

SQL查询:   选择Contributorid,   Contributorname,   COUNT(DISTINCT ContributorsSong.song_id)AS Contributor__TotalSongs   来自db_songs2contributors AS Contributor LEFT JOIN   db_songs2contributors_songs AS ContributorsSong ON   (ContributorsSongcontributor_id = Contributorid)LEFT JOIN   db_songs2songs AS Song ON(ContributorsSongsong_id =   Songid)WHERE 1 = 1 GROUP BY ContributorsSongcontributor_id    ORDER BY(0)desc LIMIT 18

我认为TotalSongs会在查询中变成Contributor__TotalSongs但会变成 0 。这里发生了什么?感谢。

1 个答案:

答案 0 :(得分:1)

我换了:

$this->Contributor->virtualFields['TotalSongs'] = 0;

使用:

$this->Contributor->virtualFields['TotalSongs'] = 'COUNT(DISTINCT ContributorsSong.song_id)';

并删除:     &#39; COUNT(DISTINCT ContributorsSong.song_id)AS Contributor__TotalSongs&#39;,

它现在适用于订购,但我无法在conditions中使用它。我认为这是Limitations of virtualFields的一部分?我试图仅选择TotalSongs&gt;的表格。 0,但我想我可以通过将连接从LEFT更改为INNER来获得另一种方式。