向 ActiveRecord 模型关系添加统计信息

Add statistical information to ActiveRecord model relation

我有以下表格:

用户

id
login
password

里程碑

id
expected_date
completion_date
project_id
user_id

项目

id
title
description

我已经生成了 ActiveRecord 类 用户、里程碑、项目。这些类中的所有字段与相应数据库表中的属性完全相同。

我需要显示分配给指定用户的项目列表。它必须看起来像这样:

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');
}

}

此方法returns 我将所有项目分配给用户。但是,但是,这些模型没有里程碑数量和已完成里程碑数量。

我可以使用以下 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 来实现它。是否可以将这些字段添加到项目模型或其他地方?如果可能的话,你能告诉我如何实现吗?

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

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

class yourClass extends \yii\db\ActiveRecord
{

public $your_var_name;

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

确保变量名称与您查询中使用的别名完全匹配.. 然后你可以像模型中的其他字段一样引用这个新字段..