Yii,CGridView:从相关表中筛选和排序计数列
我有3个表: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
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