首页 > 解决方案 > 如何在学说/php中的实体属性中聚合来自不同表的信息?

问题描述

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

Question
--------
id
questionText

Answer
------
id
answerText
questionId

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

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

现在我想在 PHP 中的 Answer 实体中添加一个附加字段,我将其称为 givenTotal。在那里我想访问给定答案的数量,如下所示:

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

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

标签: phpdoctrine-ormdoctrine

解决方案


Doctrine 有一个特性叫做“额外懒惰”的关联。在额外的惰性关联上,会count()发出一个计数查询,并且不会完全加载所有关联的实体。

只需将该标志添加到您的关系 from Answerto GivenAnswer

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

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

然后获取以计算任何答案$answer->getGivenAnswers()->count()


推荐阅读