我已经设置了一个包含测试对象的包,该对象包含许多testQuestion对象,每个对象都是一个问题和给定的答案(如果没有答案则为0)。从树枝上我希望能够从测试对象中获取信息,说明有多少问题以及已经回答了多少问题。
我创建了一个查询,将其从数据库中拉出来,在测试实体中,我创建了2个新属性来存储问题的数量和回答的数量。我创建了一个查询所在的TestRepository。 Test对象检查对象是否设置了值,如果没有,则在需要时加载它,因为我不总是需要这些信息。
但是我仍然坚持如何将存储库代码链接到测试对象,既调用repo函数又调用repo函数将值保存到相关的Test对象。
的Acme / Quizbundle /测试/ 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);
}
答案 0 :(得分:12)
您可以使用许多不同的模式来实现此结果,最简单的方法是简单地使用aggregate field。这会在修改后存储信息,而不是在每次需要时计算信息。
另一种解决方案是在Test和TestQuestion存储库之间创建一对多关联(假设已经没有一个),然后在你的twig模板中你可以简单地使用{{ testEntity.questionsAnswered.count() }}
- 你可以甚至告诉Doctrine使它成为"extra-lazy" association,以便它使用COUNT SQL语句来查找有多少已回答的问题(默认情况下,它会在您尝试枚举关联时实际获取问题实体)。
最后,我不会高度推荐这种方法,但根据您的具体情况可能需要这种方法。与您在问题中使用的方法类似,您可以在存储库中获取问题计数,但是为了与Symfony的简单模型方法保持一致,您不会从实体内部启动查询(因为实体应该永远不会有关于实体经理/存储库)。
相反,只要加载了Test实体的实例(参见here,使用postLoad事件),就可以使用Doctrine EventListener,然后调用存储库方法并从那里设置实体