2013-03-25 54 views
0

我在我的数据库中有两个表格,这些表格用于显示基于网格的信息表格。目前,我只有代码显示的信息为一个表(代码如下所示)在一个网格视图中显示两个表中的信息

<?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中第一列的房间#

简而言之:我需要count()与第一列中房间号相关联的行。我需要显示房间和容量的原始表格内容,但需要在这两列之间占用。我如何使用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

您是否阅读过http://www.yiiframework.com/doc/guide/1.1/en/database.arr#statistical-query? – soju 2013-03-25 19:55:42

回答

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 

现在结合widget时你会使用rooms_with_occupancy视图,而不是rooms表。

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

+0

宁愿使用Yii本身,以便代码是可重用的。 – ComputerLocus 2013-03-25 19:28:12

+0

使用视图的主要好处之一是可重用性。还有性能优势,易用性和可读性更高 – Kris 2013-03-25 19:53:54

+0

我以前从未实际使用过视图。我该如何修改这个表,以便在名为aux_room的表中使用,该表在表room_desk中有一个外键。您可以将room_desk视为aux_room的对象,因为每个房间都有多个分配给人员的桌子。我有点困惑如何修改这个视图代码来处理这个问题。 – ComputerLocus 2013-03-26 03:12:17

1

为了达到这个目的,最好在你的yii模型中使用关系。​​并在您的模型上实施必要的关系。下面是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应该为你设置这个。您可以看到,在列数组中使用引号内的$ data变量将使您可以访问每条记录的属性。在这个例子中,它访问UserType记录的'用户'关系并计算相关用户的数量。

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

+0

这就是我也会回答的。 – 2013-03-26 14:08:44

+0

我应该补充一点,这个例子使用引导程序扩展TbGridBView。您可能需要将类和小部件名称更改为zii.widgets.grid.CGridView。它应该或多或少地运作相同。 – ShaunUK 2013-03-26 14:37:45

+0

aux_room表与room_desk没有关系。我正在从aux_room获取主要内容。 room_desk就像是aux_room的一个对象。 room_desk分配给房间字段与aux_room关联的用户。我不确定我是否可以继续申请关系。在发表评论之后,我会发布两个表的sql。 – ComputerLocus 2013-03-26 15:23:22

相关问题