【问题标题】:Symfony query builder and aliasesSymfony 查询生成器和别名
【发布时间】: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


【解决方案1】:

您的问题更多地涉及 Doctrine,而不是 Symfony。您应该查看与 Association Mapping 相关的 Doctrine 文档。

OneToMany 关系有多种形式。您在这里可能想要的是在Question 和Answer 之间有一个bidirectional OneToMany relation。这样,您可以提出如下请求:

SELECT q, a FROM QuizBundle:Question q JOIN q.answers a WHERE q.id = :id

【讨论】:

  • 我已经编辑了我的帖子,因此您可以看到我在控制器中的内容,我正在从实体存储库中调用该函数。你也可以看到我的实体。目前,使用评论中的选择语句,我得到的问题不是我对问题的所有答案。我只是按照 Symfony 的这个例子:[symfony.com/doc/current/book/…
  • 您绝对应该发布代码而不是屏幕截图并删除无意义的部分。
  • 使用我帖子中编辑的代码,我只得到一个答案结果,问题 1,但在我的数据库中,我有两个与这个问题相关的答案。
猜你喜欢
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
相关资源
最近更新 更多