Php Symfony2/如何在实体内存储相关对象的计数

Php Symfony2/如何在实体内存储相关对象的计数,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我已经建立了一个捆绑包,它有一个测试对象,其中包含许多testQuestion对象,每个对象都是一个问题和给定的答案(如果没有答案,则为0)。从twig我希望能够从测试对象中获得信息,以说明有多少问题以及有多少问题已经得到了回答 我创建了一个查询,将其从数据库中提取出来,并在测试实体中创建了两个新属性来存储问题数和回答数。我已经创建了一个TestRepository,查询驻留在其中。测试对象检查对象是否设置了值,如果没有,则在需要时加载它,因为我并不总是需要这些信息 但是,我一直在研究如何将存储

我已经建立了一个捆绑包,它有一个测试对象,其中包含许多testQuestion对象,每个对象都是一个问题和给定的答案(如果没有答案,则为0)。从twig我希望能够从测试对象中获得信息,以说明有多少问题以及有多少问题已经得到了回答

我创建了一个查询,将其从数据库中提取出来,并在测试实体中创建了两个新属性来存储问题数和回答数。我已经创建了一个TestRepository,查询驻留在其中。测试对象检查对象是否设置了值,如果没有,则在需要时加载它,因为我并不总是需要这些信息

但是,我一直在研究如何将存储库代码链接到测试对象,既可以调用repo函数,也可以让repo函数将值保存到相关的测试对象

Acme/Quizbundle/Test/Test.php

namespace Acme\QuizBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Acme\QuizBundle\Entity\TestRepository;

/**
 * @ORM\Entity(repositoryClass="Acme\QuizBundle\Entity\TestRepository")
 * @ORM\Table(name="test")
 */
class Test    {
protected $numQuestions = null;
protected $numQuestionsAnswered = null;

public function getNumQuestionsAnswered () {
    if (is_null($this->numQuestionsAnswered)) {
        $repository = $this->getEntityManager()->getRepository('\AcmeQuizBundle\Test');
        $values = $repository->calculateNumQuestions();
    }
    return $this->numQuestionsAnswered;
}
Acme/Quizbundle/Test/TestRepository.php(getNumQuestions()有一个匹配的方法)


您可以使用许多不同的模式来实现此结果,其中最简单的就是简单地使用。这将在修改后存储信息,而不是在每次需要时进行计算

另一种解决方案是在您的测试和TestQuestion存储库之间创建一个一对多的关联(假设还没有),然后在细枝模板中,您可以简单地使用
{{testEntity.questionsAnswered.count()}
-您甚至可以告诉Doctrine将其设置为一个,以便它使用COUNT SQL语句查找有多少个已回答的问题(默认情况下,当您尝试枚举关联时,它实际上会获取问题实体)

最后,有一种方法我不推荐,但根据您的情况可能需要。与您在问题中使用的方法类似,您可以在存储库中获取问题计数,但为了与Symfony的简单模型方法保持一致,您不会从实体内部开始查询(因为实体永远不应该拥有关于实体管理器/存储库的信息)


相反,您可以使用Doctrine EventListener在加载测试实体的实例时得到通知(请参阅使用postLoad事件),然后调用存储库方法并在实体上进行设置。

谢谢,这真的很有帮助!!1对于额外的延迟关联,必须使用
Collection#count()
调用,而不是内置的细枝
lenght
。使用SQL计数的正确方法:
{{testEntity.questionsansweed.COUNT}
|length
将导致在内存中获取行!)感谢您的更正@sania_Zol,相应地更新了答案
namespace Acme\QuizBundle\Entity;

use Doctrine\ORM\EntityRepository;

class TestRepository extends EntityRepository {

private function calculateNumQuestions() {

    $qb = $this->getEntityManager()
                ->createQueryBuilder();

    $query = $this->getEntityManager()->createQueryBuilder()
                        ->select('COUNT(id)')
          ->from('testquestion', 'tq')
          ->where('tq.test_id = :id')
          ->setParameter('id', $this->getId())
          ->getQuery();

    $result = $query->getSingleScalarResult();
    var_dump($result);
    }