2013-03-25 24 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

相關問題