Как сделать подсчет записей в Yii Framework?

У меня есть две таблицы «Компания» и «Отдел».

CREATE TABLE Department (
id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
deptName VARCHAR(40),
CompanyId TINYINT UNSIGNED NOT NULL,
FOREIGN KEY (CompanyId) REFERENCES Companies(id) ON DELETE CASCADE,
UNIQUE (deptName))

CREATE TABLE Company (
id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
companyName VARCHAR(40),
email VARCHAR(60),
UNIQUE (companyName))

Я создаю новые записи, обновляю, удаляю и показываю все записи. Но теперь я хочу показать общее количество отделов для конкретной компании. Например:

Компания А имеет 3 отдела Компания Б имеет 2 отдела. Я просто хочу подсчитать количество отделов. Выходной ток

ID: 1   
Company Name: CompanyA  
Email: [email protected]

но я хочу показать

ID: 1   
Company Name: CompanyA  
Email: [email protected]
Total Department: 3 //it can be different

Это всего лишь одна запись, но у меня есть много компаний, отображаемых в моем выводе. У отдела есть другая таблица.. какой код мне нужно изменить, чтобы показать общее количество отделов.

У меня есть контроллеры «CompanyController» и «DepartmentController», созданные с использованием операций CRUD в Gii, имеют простые функции.

Это мой index.php

<h1>Companies</h1>

<?php $this->widget('zii.widgets.CListView', array(
'dataProvider'=>$dataProvider,
'itemView'=>'_view',
)); ?>

Это мой файл _view

<div class="view">

<b><?php echo CHtml::encode($data->getAttributeLabel('id')); ?>:</b>
<?php echo CHtml::link(CHtml::encode($data->id), array('view', 'id'=>$data->id)); ?>
<br />

<b><?php echo CHtml::encode($data->getAttributeLabel('companyName')); ?>:</b>
<?php echo CHtml::encode($data->companyName); ?>

Я не уверен, где следует подсчитывать данные. Я написал функцию для подсчета общего количества отделов в контроллере отдела, но она не работает, вот моя функция.

public function totalDept()
{
    $CompanyId=1;
    $totalDept=Department::model()->findAll($CompanyId);
    $numberOfDept=count($totalDept);
    if ($numberOfDept> 0) {
        echo "There are" .$numberOfDept. "in this company";
    } else {
        echo 'This company has No Department so far...';
    }

}

и когда я показываю, на мой взгляд, это не работает.. он говорит, что свойство Department.totaldept не определено

<b><?php echo CHtml::encode($data->getAttributeLabel('Total Departments')); ?>:</b>
<?php echo CHtml::encode(Department::model()->totalDept); ?>
<br />

что бы я ни пытался сделать, это правильный путь или я делаю это неправильно, я просто новичок в yii, просто пытаюсь изучить yii..


person Asfandyar Khan    schedule 18.03.2016    source источник


Ответы (2)


В соответствии с соглашениями Yii. вы должны сначала определить отношения между Company и Department в файлах модели.

В вашем случае - у компании много отделов, поэтому в модели вашей компании определите отношение, как показано ниже (при условии, что вы используете Yii 1.x)

public function relations()
{
    return array(
        // other relationships
        'departments' => array(self::HAS_MANY, 'Department', 'CompanyId'),
    );
}

После того, как вы определили эту связь, вы можете получить количество отделов компании, как показано ниже, в вашем файле _view.

echo count($data->departments);
person yetanotherse    schedule 18.03.2016
comment
Я уже определил отношения в отделе return array( 'departments' => array(self::HAS_MANY, 'Department', 'CompanyId') и в модели компаний return array( 'company' => array(self::BELONGS_TO, 'Companies', 'CompanyId'), ); - person Asfandyar Khan; 18.03.2016
comment
Тогда фрагмент кода, которым я поделился в своем ответе, будет работать для подсчета отделов компании. - person yetanotherse; 19.03.2016
comment
Здорово. Не могли бы вы отметить это как правильный ответ :) - person yetanotherse; 21.03.2016

Вы можете просто определить «атрибут» в вашем методе отношений () вашего класса AR компании, который будет выполнять статистический запрос (по умолчанию подсчет). Вы можете сделать это, используя "self::STAT" в качестве типа отношения, см. пример ниже:

public function relations()
{
    return array(
        // other relationships
        'totalOfdepartments' => array(self::STAT, 'Department', 'CompanyId'),
    );
}

Вы можете получить дополнительную информацию здесь: http://www.yiiframework.com/doc/guide/1.1/en/database.arr#statistical-query

person batusa    schedule 18.03.2016