如何从 doctrine/php 中的实体属性中的不同 table 聚合信息?

How to aggregate information from a different table in an entity attribute in doctrine/php?

我正在使用 PHP Symfony 5.2 和 doctrine-orm。我有以下实体:

Question
--------
id
questionText

Answer
------
id
answerText
questionId

GivenAnswer
-----------
id
answerId

用户访问我的网站并可以回答问题。每个问题有两到四个答案。发送答案后,它们将保存在 table GivenAnswer 中,其中每个答案都会创建一个带有 answerId 的新行。

现在我想在 PHP 中的 Answer 实体中添加一个字段,我将其称为 givenTotal。我想像这样访问给定答案的数量:

echo "Answer given " . $answer->givenTotal() . " times";

我知道如何使用 SQL 请求此信息,但我不想遍历所有带有答案对象的问题以将该信息加载到属性中。有没有办法对其进行编码,使 doctrine-orm 将 givenAnswer 计数加载到该属性中?

Doctrine 有一个功能叫做 "extra lazy" association。在额外的惰性关联上 count() 发出计数查询并且不会完全加载所有关联实体。

只需将该标志添加到您从 AnswerGivenAnswer 的关系中:

/**
* @Entity
*/
Class Answer
{
     /**
     * @ManyToMany(targetEntity="GivenAnswer", mappedBy="answer", fetch="EXTRA_LAZY")
     */
    public $givenAnswers;

    public function getGivenAnswers() :ArrayCollection
    {
        return $this->givenAnswers;
    }
}  

然后使用 $answer->getGivenAnswers()->count()

获取任何答案的计数