Yii,CGridView:从相关表中筛选和排序计数列

Yii,CGridView:从相关表中筛选和排序计数列,yii,cgridview,dataprovider,Yii,Cgridview,Dataprovider,我有3个表:productions,chunk(production可能有很多chunk,所以chunk包含production\u id列)和chunk\u designers(chunk\u designers可能有很多设计器,所以chunk\u designers有一列chunk\u id) 我必须在CGridView中呈现产品中的数据,并添加一列:未分配给任何区块的区块计数(表中每个生产项目的)。换言之: SELECT COUNT(*) FROM `chunks` left JOIN

我有3个表:
productions
chunk
(production可能有很多chunk,所以
chunk
包含
production\u id
列)和
chunk\u designers
(chunk\u designers可能有很多设计器,所以
chunk\u designers
有一列
chunk\u id

我必须在CGridView中呈现
产品
中的数据,并添加一列:未分配给任何区块的区块计数(表中每个生产项目的)。换言之:

SELECT COUNT(*) FROM `chunks` 
left JOIN `chunk_designers`
ON chunks.id = chunk_designers.chunk_id
WHERE production_id = 520 AND chunk_id IS null
…其中520-每行的动态值,
productions.id

ChunkController
操作:

function actionProductionList() {

    $model = new Productions('search');
    $model->unsetAttributes();  // clear any default values

    $dataProvider = $model->search($_GET);
    $dataProvider->criteria->order = 'start_time DESC';

    $this->render('production_list', array(
        'provider' => $dataProvider,
        'model' => $model,
    ));
}
型号
产品

class Productions extends AppModel {
    ....
    public $unassignedBlocksCount;
    ....

    public function rules() {
        return array(
            array('unassignedBlocksCount, id, ...', 'safe'),
            array('unassignedBlocksCount, id, ...', 'safe', 'on'=>'search'),
        );
    }

    //in search() I added:
    $criteria->compare('unassignedBlocksCount', $this->unassignedBlocksCount, true);

}
鉴于:

$this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'menu-grid',
    'dataProvider' => $provider,
    'filter' => $model,
    'enablePagination' => true,
    'columns' => array(
        array(
            'name' => 'unassignedBlocksCount',
            'value' => 'Chunks::getUnassignedBlocksCount($data->id)'
        ),
        ...
列数据呈现得很好,但当我尝试对其进行过滤时,会出现以下错误:
where子句中的未知列unassignedblockscont

我尝试在
Productions
model中的
search()
方法中编写:

// subquery to retrieve the count of posts
$count_sql = "(SELECT COUNT(*) FROM `chunks` "
                 . "LEFT JOIN `chunk_designers` "
                 . "ON chunks.id = chunk_designers.chunk_id "
                 . "WHERE production_id = 520 AND chunk_id IS NULL)";

// select
$criteria->select = array(
                          '*',
                          $count_sql . " as unassignedBlocksCount",
                    );
并且刚刚在视图中的
列中添加了
unassignedblockscont
元素

但在筛选时,我仍然会遇到相同的错误,问题是我不知道如何根据每个表行动态获取
count\u sql
中的
production\u id
(这就是为什么该列的每行值都是1,因为它是
production\u id
=520的正确值)


所以,我的问题是:如何在CGridView中获得可排序和可筛选列,它是(通过
COUNT()
)从其他表中的数据计算出来的?提前感谢。

查看ArrayDataProvider,也可以查看SqlDataProvider