2013-03-25 4 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.

Проще говоря: Мне нужно подсчитать строки, связанные с номером комнаты из первого столбца. Мне нужно отобразить исходные таблицы содержимого комнаты и емкости, но с занятостью между этими двумя столбцами. Как мне это сделать с помощью 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

ответ

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.

+0

Предпочитаете использовать сам Yii, чтобы код был повторно использован. – ComputerLocus

+0

Одним из основных преимуществ использования просмотров является многократное использование. Имеются также преимущества в производительности, простота использования и повышенная читаемость. – Kris

+0

Я никогда раньше не использовал представления. Как мне изменить это для работы с таблицей с именем aux_room, которая имеет внешний ключ в таблице room_desk. Вы можете думать о том, что room_desk является объектом aux_room, поскольку в каждой комнате есть несколько столов, назначенных людям. Я немного смущен, как я могу изменить этот код представления, чтобы работать с этим. – ComputerLocus

1

Чтобы достичь этого, было бы лучше использовать отношения в вашей модели yii. Read this и выполните необходимые отношения на ваших моделях. Ниже приведен пример в yii того, как вы можете показать счет из связанной модели с использованием отношения. В моем проекте это показывает количество пользователей данного типа рядом со списком типов пользователей.

В моем проекте файл подкачки находится в представлениях/usertype/admin.php, как и для сетки просмотра admin, то же самое применимо для индексного представления.

<?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 передается из метода actionAdmin() контроллера UserType. Gii должен установить это для вас. Вы можете видеть, что использование переменной $ data внутри кавычек в массиве столбцов даст вам доступ к свойствам каждой отдельной записи. В этом примере он обращается к «пользовательским» отношениям записи UserType и подсчитывает количество связанных пользователей.

Эти отношения устраняют необходимость записи любого сложного SQL. Yii запросит данные и выполнит все необходимые для вас подключения.

+0

Вот на что я ответил бы. –

+0

Я должен добавить, что в этом примере используется расширение бутстрапа TbGridBView. Возможно, вам придется изменить имя класса и виджета на zii.widgets.grid.CGridView. Он должен функционировать более или менее одинаково. – ShaunUK

+0

aux_room table не имеет отношения с room_desk. Я получаю основной контент из aux_room. room_desk похож на объект aux_room. room_desk назначается пользователю, где поле комнаты связано с aux_room. Я не уверен, могу ли я по-прежнему применять отношения из-за этого. После этого комментария я выложу sql для двух таблиц. – ComputerLocus

Смежные вопросы