- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在开展一个语言评估项目,该项目使您能够以您想要的语言参加考试并评估您的水平。我使用 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 中。
要自动加入相关实体学说的获取选项,可用于:
示例:
/**
* @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/
我想知道存储库在 Doctrine 中意味着什么? 有人可以解释一下吗? 最佳答案 许多 ORM(对象关系映射器)使用的术语“存储库”, Doctrine 只是其中之一。 它意味着可以从数据存储库访问
我尝试使用 进行数据库查询 $position = $repository->findBy( array('id' => $profileId,'datum' => '10.07.2011')
几个月前,有一个命令可以将 Doctrine 1 架构文件转换为 Doctrine 2 实体,但是,该命令不再存在。 我刚刚开始使用 Symfony2 RC1。 有没有被删除的原因?我有一个 600
我有一个实体,称为 Stones,Stones 与 Attributes 有 ManyToMany 关系。 所以我查询实体以获取石头,然后将其水化以将其转换为数组。 $result = $t
我在 zend 框架 2 中使用了学说 2。要使用数据库表生成实体,使用的控制台命令是: php doctrine-module orm:convert-mapping --force --from-
我需要一个具体的代码示例,其中包含使用“多态关联”的 Doctrine 2。 让我澄清一下自己。我有一个名为 Contract 的实体,一个契约(Contract)可以有许多价格规则,这些价格规则可以
我知道条件过滤器尚不可用于查询(根据 Doctrine2 手册已知限制部分中的“26.1.4. Applying Filter Rules to any Query”),所以我想问问专家他们首选的解决
我在所有网络上搜索..但没有找到这个问题的回复。为了记录我的项目实体中的更改,我想使用 stof 条令扩展 - 可记录,但对我来说并不明显,实体的更改如何存储在数据库中?我可以定义我自己的历史表并在那
我使用两个类: namespace Test; use Doctrine\ORM\Mapping as ORM; /** *@Table() *@InheritanceType("Joined")
A previous question I asked与使用 Doctrine 和查询生成器时对结果集进行水化有关。我的问题是如何返回数组及其子集: 这是针对单个结果集的,答案很简单: $qb
我有两个实体 User和 Article多对多关系为 Article可以有很多作者。 class User { /** @var string */ public $name;
我有一个看起来像这样的查询: 我的用户实体具有如下所示的一对一关系: /** * @var UserProfile * * @ORM\OneToOne(targetEntity="UserPro
我最近正在阅读Doctrine 2's best practices并被此阻止: 25.3. Avoid composite keys Even though Doctrine fully suppo
如何在服务容器中使用 Doctrine? 该代码只会导致错误消息“ fatal error :调用未定义的方法 ...::get()”。 em = $em; } public func
向一条记录加载 Doctrine 的首选方式是什么? 我正在使用 $em = EntityManager::create($connectionOptions, $config); $dql = "s
我正在使用 Doctrine,并且想要记录所有生成的 SQL 查询。 我知道我可以使用 $q->getSqlQuery() 但我不想每次都手动执行此操作。 有没有办法自动完成? 最佳答案 如果您打开日
如何在 Doctrine 中找到分组最大值或包含最大值的行?在 SQL 中,我通常会使用自连接来执行此操作,如 here 中所述。 . 虽然可以在 Doctrine 中建立 self 关系,但有更好的
我在谷歌上浪费了数万亿个小时,但没有一个解决方案是好的。 我有这个查询生成器: $qb2=$this->createQueryBuilder('s') ->addSel
我有以下问题: 实体具有经典的创建/更新时间戳字段,应将其设置为 UTC 中的当前时间戳。 在实体上,我使用 columnDefinition 属性将它们设置为 "TIMESTAMP NOT NULL
我需要从多个相关表中执行 DQL 删除。 在 SQL 中,它是这样的: DELETE r1,r2 FROM ComRealty_objects r1, com_realty_objects_p
我是一名优秀的程序员,十分优秀!