2015-11-19 3 views
1

У меня есть следующие таблицы:Добавить статистическую информацию ActiveRecord модели отношения

пользователя

id 
login 
password 

веха

id 
expected_date 
completion_date 
project_id 
user_id 

проект

id 
title 
description 

У меня уже созданы классы ActiveRecord User, Milestone, Project. Все поля в этих классах точно такие же, как и атрибуты в соответствующих таблицах БД.

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

ID | Title | Amount of milestones | Amount of completed milestones 

Теперь я ВОССТАНОВЛЕНИЕ проекты, как это:

$projects = Yii::$app->user->identity->getAssignedProjects()->all(); 

Где getAssignedProjects() метод выглядит следующим образом:

class User extends \yii\db\ActiveRecord implements IdentityInterface 
{ 

... 

public function getAssignedProjects() 
{ 
    return $this->hasMany(Project::className(), ['id' => 'project_id'])->via('milestones'); 
} 

} 

Этот метод возвращает мне все проекты назначенный пользователю. Но, однако, эти модели не имеют количества этапов и количества завершенных этапов.

я могу получить всю необходимую информацию с помощью следующего SQL запроса:

SELECT 
    proj.* 
FROM 
(
    SELECT 
     t.*, 
     COUNT(m.completion_date) AS completed, 
     COUNT(1) AS total 
    FROM project AS t 
    LEFT JOIN milestone AS m ON m.project_id = t.id 
    GROUP BY t.id 
) AS proj 
INNER JOIN milestone AS ms ON ms.project_id = proj.id 
WHERE ms.user_id = 1 
GROUP BY proj.id; 

Но я не могу найти способ реализовать его с точки зрения ActiveRecord. Можно ли добавить эти поля в модель проекта или в другое место? Если это возможно, можете ли вы показать мне, пожалуйста, как это реализовать?

ответ

0

Вы должны добавить var для интересующего вас поля.

Для activerecord Yii2 автоматически генерирует извлечение поля из схемы таблицы. Для расчетной области, как поле используется AS результата для псевдонима запроса необходимо добавить родственное имя уага модели

class yourClass extends \yii\db\ActiveRecord 
{ 

public $your_var_name; 

/** 
* @inheritdoc 
*/ 
public static function tableName() 
{ 
    return 'your_table'; 
} 

убедитесь, что матч имени вара exacly псевдоним используется в запросе .. Тогда вы можете обратиться к это новое поле, как и другие в модели.

+0

Да, я прочитал что-то подобное в документах или других вопросах. Однако я не понимаю, куда поместить код, который отвечает за получение статистической информации. Можно ли загружать эту информацию, когда я вызываю метод 'Yii :: $ app-> user-> identity-> getAssignedProjects() -> all();'? И, также, нужно ли использовать QueryBuilder или работать с простым SQL? – DWand

+0

Конструктор запросов является более прямым (простым) решением. Для модели пользователя я не знаю, имеет ли право доступ к идентификационной информации, как вы упомянули, но вы можете получить значение по модели пользователя. Пользователь: AssignedProject. Я надеюсь, что это полезно для вас. – scaisEdge

+0

Я думаю, я понимаю, что вы имеете в виду. Спасибо. Я оставлю этот вопрос открытым на пару дней. На всякий случай кто-то сможет предложить что-то еще. – DWand

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