将统计信息添加到ActiveRecord模型关系

时间:2015-11-19 15:55:25

标签: mysql activerecord yii2 foreign-key-relationship

我有以下表格:

用户

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来实现它的方法。是否可以将这些字段添加到项目模型或其他位置?如果有可能,请告诉我,如何实施?

1 个答案:

答案 0 :(得分:0)

您必须为您需要的字段添加var。

对于activerecord,Yii2自动生成从表模式中检索的字段。对于计算字段,如使用AS结果查询别名,您必须将相关的var名称添加到模型

class yourClass extends \yii\db\ActiveRecord
{

public $your_var_name;

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

确保var名称与查询中使用的别名完全匹配。 然后你可以像模型中的其他人一样引用这个新领域。