Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql A有很多B,B有很多C,找到属于A的C的计数_Sql_Database_Yii - Fatal编程技术网

Sql A有很多B,B有很多C,找到属于A的C的计数

Sql A有很多B,B有很多C,找到属于A的C的计数,sql,database,yii,Sql,Database,Yii,基本上,我有三张桌子 house_table =========== house_id floor_table =========== floor_id house_id room_table =========== room_id floor_id is_occupied 房子有很多层,一层有很多房间。一个房间属于一层,一层属于一所房子。gii自动创建的相应模型为HouseTable,FloorTable,RoomTable 我需要的是findAll()有空房的房子 我该怎么做?像这

基本上,我有三张桌子

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',
    ));

不幸的是,事实证明,人们不能使用这些统计关系作为条件!(在这里确认:)。

我认为这应该可以奏效

'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' ,
),

我加入书签是因为它看起来很有趣。我可以告诉你,你可以有其他类型的数据提供者,甚至可以自己制作。例如:
类ArrayAsObjectDataProvider扩展\CArrayDataProvider{public function}构造($rawData,$config=array()){foreach($rawData as$data){$object=new\stdClass();foreach($key=>$value){$object->$key=$value;}$this->rawData[]=$object;}foreach($config as$key=>$value)$this->$key=$value;}}
我当然希望它可以通过关系来完成。看看它是否能帮助我获得
CStatRelation。别名未定义。有什么想法吗?我通过修复一些东西来实现它。您可能应该在这里更新代码。