基本上,我有3张桌子。
house_table
===========
house_id
floor_table
===========
floor_id
house_id
room_table
===========
room_id
floor_id
is_occupied
房子有很多楼层,楼层有很多房间。一个房间属于一个楼层,一个楼层属于一个房子。由gii自动创建的相应模型为HouseTable
,FloorTable
,RoomTable
。
我需要的是findAll()
有房间没有被占用的房屋。
我该怎么做?像这样的东西?
class HouseRecord extends CActiveRecord {
public function relations() {
return array(
'FREE_ROOM_COUNT' => array(self::STAT ...???...),
);
}
}
当然,我可以用SQL来做,但是需要这样做,因为findAll()
的结果被用作网格中的数据提供者。
更新
遵循tinybyte的建议,这里最终有效。
public function relations() {
return array(
'FREE_ROOM_COUNT' => array(
self::STAT ,
'FloorTable',
'house_id',
'select' => 'COUNT(rt.floor_id)',
'join' => 'INNER JOIN room_table rt ON t.floor_id = rt.floor_id',
'condition' => 'rt.is_occupied = 0',
),
);
}
并且可以这样使用:
$criteria = new CDbCriteria;
$criteria->with = array('FREE_ROOM_COUNT');
$criteria->together = true;
$provider = new CActiveDataProvider(HouseTable::model(), array(
'criteria'=>$criteria,
'pagination' => array(
'pageSize' => 1,
),
));
$this->widget('zii.widgets.CListView', array(
'dataProvider'=>$provider,
'itemView'=>'house',
));
不幸的是,事实证明一个人不能使用这些STAT关系作为条件! (在此确认:Using STAT relation in CActiveDataProvider criteria)。
答案 0 :(得分:0)
我认为这应该可以解决问题
'FREE_ROOM_COUNT' => array(
self::STAT ,
'Floor' ,
'house_id'
'select' => 'count(rt.floor_id)' , // or count(rt.room_id)
'join' => 'Inner join room_table rt ON Floor.floor_id = rt.floor_id' ,
),