在一个网格视图中显示两个表的信息

时间:2013-03-25 18:56:38

标签: php yii

我的数据库中有两个表,用于显示基于网格的信息表。目前我的代码只显示一个表的信息(下面的代码)

<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'aux-room-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        'room',
        'capacity',
        array(
            'class'=>'CButtonColumn',
        ),
    ),
)); ?>

因为我有容量,所以我也希望根据与我的第二张桌子中的房间号相关联的行数来获得占用率。我知道如果不使用PHP,这看起来可能相当简单,但我是Yii的新手并且不明白我如何能够对另一个模型进行计数。为了找到占用率,我需要使用房间#,这是表1的第一列。

简单地说:我需要计算()与第一列中的房间号相关联的行。我需要显示原始表格的房间和容量的内容,但这两列之间的占用率。我怎么用Yii做到这一点?

两个表的SQL:

CREATE  TABLE IF NOT EXISTS `cs_people`.`aux_room` (
  `room` VARCHAR(20) NOT NULL ,
  `capacity` VARCHAR(20) NULL ,
  PRIMARY KEY (`room`) )
ENGINE = InnoDB;

CREATE  TABLE IF NOT EXISTS `cs_people`.`room_desk` (
  `userid` VARCHAR(8) NOT NULL ,
  `room` VARCHAR(20) NULL ,
  `desk` VARCHAR(250) NULL ,
  PRIMARY KEY (`userid`) ,
  INDEX `room_desk.room_idx` (`room` ASC) ,
  CONSTRAINT `room_desk.userid`
    FOREIGN KEY (`userid` )
    REFERENCES `cs_people`.`people` (`userid` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `room_desk.room`
    FOREIGN KEY (`room` )
    REFERENCES `cs_people`.`aux_room` (`room` )
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;

2 个答案:

答案 0 :(得分:1)

要实现这一点,最好在yii模型中使用关系。 Read this并在模型上实施必要的关系。下面是yii中如何使用关系显示相关模型的计数的示例。在我的项目中,这显示了用户类型列表旁边给定类型的用户数。

在我的项目中,下面的文件存在于views / usertype / admin.php中,就像管理视图网格一样,这同样适用于索引视图。

<?php
$this->widget('bootstrap.widgets.TbGridView', array(
    'id' => 'user-type-grid',
    'dataProvider' => $model->search(),
    'filter' => $model,
    'template' => '{items}',
    'columns' => array(
        'id',
        'name',
        array('header' => 'Users', 'value' => 'count($data->users)'),
        array(
            'class' => 'bootstrap.widgets.TbButtonColumn',
        ),
    ),
));
?>

$ model变量从UserType控制器的actionAdmin()方法传递。 Gii应该为你做好准备。您可以看到使用columns数组中的引号内的$ data变量将允许您访问每个单独记录的属性。在此示例中,它访问UserType记录的“用户”关系并计算相关用户的数量。

这些关系消除了编写任何复杂SQL的需要。 Yii将查询数据并为您执行所有必要的连接。

答案 1 :(得分:0)

不是Yii特定的解决方案,但就个人而言,我会使用视图直接从数据库中获取数据。

类似的东西:

CREATE VIEW rooms_with_occupancy 
AS
    SELECT r.*, count(o.*) as occupant_count
    FROM rooms r
    LEFT JOIN occupancy o ON o.room_id = r.id
    GROUP BY r.id

现在绑定小部件时,您将使用rooms_with_occupancy视图而不是rooms表。

有关创建视图的详细信息,请参阅the official documentation