【发布时间】:2016-07-02 23:39:20
【问题描述】:
在 Symfony 中,我有两个相互关联的实体(问题、答案)。两个实体之间的关系是一对多(一个问题可以有多个答案) 根据 Symfony 关于两个实体之间关系的文档,我正在使用 Symfony 在答案实体中生成的 question_id 字段。在我的问题实体存储库中使用查询我试图得到一个包含所有答案的问题,但是按照文档Joining Related Records in Symfony 关于如何加入相关记录我无法理解别名在 Symfony 中的工作原理。 非常感谢您在理解别名方面的帮助。谢谢 这就是我的问题存储库类和控制器中的内容。目前,我得到的是一个答案结果,而不是与我的问题相关的所有答案。
public function findOneByIdJoinedToCategory($questionId)
{
$query = $this->getEntityManager()
->createQuery(
'SELECT a, q FROM QuizBundle:Answer a
JOIN a.answers q
WHERE a.id = :id'
)->setParameter('id', $questionId);
try {
return $query->getOneOrNullResult();
} catch (\Doctrine\ORM\NoResultException $e) {
return null;
}
}
public function showAction($answerId)
{
$product = $this->getDoctrine()
->getRepository('QuizBundle:Answer')
->findOneByIdJoinedToCategory($answerId);
$data = $product->getAnswer();
return new Response($data);
// ...
}
我的实体之间的关系:
class Answer
{
/**
* @ORM\ManyToOne(targetEntity="Question", inversedBy="answers")
* @ORM\JoinColumn(name="question_id", referencedColumnName="id")
*/
private $question;
public function setQuestion(\QuizBundle\Entity\Question $question = null)
{
$this->question = $question;
return $this;
}
/**
* Get question
*
* @return \QuizBundle\Entity\Question
*/
public function getQuestion()
{
return $this->question;
}
}
class Question
{
/**
* @ORM\OneToMany(targetEntity="Answer", mappedBy="question")
*/
private $answers;
public function __construct()
{
$this->answers = new ArrayCollection();
}
public function addAnswer(\QuizBundle\Entity\Answer $answer)
{
$this->answers[] = $answer;
return $this;
}
/**
* Remove answer
*
* @param \QuizBundle\Entity\Answer $answer
*/
public function removeAnswer(\QuizBundle\Entity\Answer $answer)
{
$this->answers->removeElement($answer);
}
/**
* Get answers
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getAnswers()
{
return $this->answers;
}
}
【问题讨论】:
-
如果您只想捕获返回
null的异常,我建议您使用方法getOneOrNullResult()而不是getSingleResult()。 -
你能贴出相关代码,显示教义问答之间的关系吗?可能您不需要复杂的 DQL,但您可以简单地浏览关系....(例如,只需查找答案然后执行
$answer->getQuestions())让我知道 -
@Matteo 检查已编辑的帖子。目前在我的代码中,我只得到一个答案,但我的问题有两个答案。问题 ID 在 question_id 字段的 Answer 实体中引用。
-
你怎么看:1)如果你有问题对象你可以做:
$question->getAnswers()2)如果你有答案并且想得到相关问题的所有答案你可以做:$answer->getQuestion()->getAnswers() -
@Matteo 如果我进入问题存储库并且在控制器中我有这个代码
$data = $question->getAnswers();并且我转储数据,我会得到一个持久性集合。在集合中,我确实有 '#collection: ArrayCollection {#462 ▼ -elements: array:2 [▼ 0 => Answer {#455 ▶} 1 => Answer {#453 ▶} ] }'
标签: php doctrine-orm symfony query-builder