我已经建立了一个bundle,其中包含一个test对象,该对象包含许多testQuestion对象,每个对象都是一个问题和给定的答案(如果没有答案,则为0)。我希望能够从twig中获得来自test对象的信息,以说明存在多少个问题以及已经回答了多少个问题。
我已经创建了一个查询来将其从数据库中提取出来,并且在测试实体中,我已经创建了2个新属性来存储问题的数量和回答的数量。我已经创建了一个TestRepository,查询驻留在其中。测试对象检查对象是否设置了值,如果没有,则在需要时加载它,因为我并不总是需要这些信息。
然而,我在如何将存储库代码链接到测试对象上遇到了麻烦,既要调用repo函数,又要让repo函数将值保存到相关的Test对象。
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()匹配的方法)
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);
}
1条答案
按热度按时间lskq00tm1#
有许多不同的模式可以用来实现这个结果,最简单的模式是使用aggregate field,它存储修改后的信息,而不是每次需要时都计算它。
另一种解决方案是在Test和TestQuestion存储库之间创建一对多关联(假设还没有),那么在您的小枝模板中,您可以简单地使用
{{ testEntity.questionsAnswered.count() }}
-您甚至可以告诉Doctrine将其设置为“额外惰性”关联,以便它使用COUNT SQL语句来查找有多少已回答的问题(默认情况下,当您尝试枚举关联时,它实际上获取问题实体)。最后,还有一种方法,我不会高度推荐,但根据您的情况可能需要使用。与您在问题中使用的方法类似,您在存储库中获取问题计数,但为了与Symfony的简单模型方法保持一致,您不从实体内部启动查询(因为实体永远不应该有关于实体管理器/存储库的信息)。
相反,您可以使用Doctrine EventListener,以便在加载Test实体的示例时获得通知(请参阅此处,使用postLoad事件),然后调用存储库方法并从那里对实体进行设置。