gpt4 book ai didi

symfony - 使用 Doctrine2 和 Symfony2 从单向多对多关系获取实体

转载 作者:行者123 更新时间:2023-12-02 14:22:42 26 4
gpt4 key购买 nike

我目前正在开展一个语言评估项目,该项目使您能够以您想要的语言参加考试并评估您的水平。我使用 Symfony2 框架并使用 Doctrine2。我的问题如下:

我有两个实体 Exam 和 Question,通过多对多关系链接(Exam 是所有者)。每个考试可以与多个问题相关,每个问题可以与多个考试相关。

这是我的代码:

考试实体

/**
* Exam
*
* @ORM\Table(name="cids_exam")
* @ORM\Entity(repositoryClass="LA\AdminBundle\Entity\ExamRepository")
*/
class Exam
{
...

/**
* @ORM\ManyToMany(targetEntity="LA\AdminBundle\Entity\Question", cascade={"persist"})
* @ORM\JoinTable(name="cids_exam_question")
*/
private $questions;

...


/**
* Constructor
*/
public function __construct()
{
$this->questions = new \Doctrine\Common\Collections\ArrayCollection();
}

/**
* Add questions
*
* @param \LA\AdminBundle\Entity\Question $questions
* @return Exam
*/
public function addQuestion(\LA\AdminBundle\Entity\Question $questions)
{
$this->questions[] = $questions;

return $this;
}

/**
* Remove questions
*
* @param \LA\AdminBundle\Entity\Question $questions
*/
public function removeQuestion(\LA\AdminBundle\Entity\Question $questions)
{
$this->questions->removeElement($questions);
}

/**
* Get questions
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getQuestions()
{
return $this->questions;
}
}

只要是单向关系,我的 Question 类中就没有 'exams' 属性。

现在,我想做的是获取与特定考试相关的所有问题,调用 getQuestions() 方法,如下所示:

$questions = $exam->getQuestions();

但是这个方法返回一个空数组,即使我的数据库中有数据。如果我 var_dump $exam 变量,我可以看到问题数组为空:

object(LA\AdminBundle\Entity\Exam)[47]
private 'id' => int 5
...
private 'questions' =>
object(Doctrine\ORM\PersistentCollection)[248]
private 'snapshot' =>
array (size=0)
empty
private 'owner' => null
private 'association' => null
private 'em' => null
private 'backRefFieldName' => null
private 'typeClass' => null
private 'isDirty' => boolean false
private 'initialized' => boolean false
private 'coll' =>
object(Doctrine\Common\Collections\ArrayCollection)[249]
private '_elements' =>
array (size=0)
...

我想我也许可以在 QuestionRepository 中编写一个 findByExam() 函数,但我真的不知道在这种情况下如何实现连接。

任何帮助都会很棒!

最佳答案

要在 QuestionRepository 中使用 findByExam() 方法,请执行以下操作:

 public function findByExam($exam)
{
$q = $this->createQueryBuilder('q')
->where('q.exam = :exam')
->setParameter('exam', $exam)
->getQuery();

return $q->getResult();
}

您还可以创建双向关系而不是单向关系!

Each exam can be related to several questions, and each question can be related to several exams.

通过将其添加到您的问题实体来创建双向关系:

use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\ArrayCollection;
use Vendor\YourExamBundle\Entity\ExamInterface;

class Question
{
protected $exams;

public function __construct()
{
$this->exams = new ArrayCollection();
}

public function getExams()
{
return $this->exams;
}

public function addExam(ExamInterface $exam)
{
if !($this->exams->contains($exam)) {
$this->exams->add($exam);
}
return $this;
}

public function setExams(Collection $exams)
{
$this->exams = $exams;

return $this;
}

// ...

之后您可以使用...

$question->getExams()

...在你的 Controller 中。

要自动加入相关实体学说的获取选项,可用于:

  • LAZY(访问时加载关系)
  • EAGER(自动加入关系)
  • EXTRA_LAZY(手动获取)

示例:

/**
* @ManyToMany(targetEntity="Question",inversedBy="exams", cascade={"all"}, fetch="EAGER")
*/

虽然急切加载在性能方面有缺点,但它可能是您的一个选择。

用 EAGER 获取教义

Whenever you query for an entity that has persistent associations and these associations are mapped as EAGER, they will automatically be loaded together with the entity being queried and is thus immediately available to your application.

Doctrine Documentation 中了解更多相关信息.

处理关系时应检查的另一个选项是级联选项。

请参阅Doctrine - Working with Associations文档的章节。

提示:您应该为考试和问题创建接口(interface),并使用它们代替集合中的原始实体,并添加方法以方便扩展。

关于symfony - 使用 Doctrine2 和 Symfony2 从单向多对多关系获取实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16690106/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com