不确定这里的标题是否有点含糊不清,但基本上我尝试做的是从数据库中获取数据,但我需要引用一个没有自己的实体的连接表,因为它&# 39; s仅在另一个实体中引用。
这是我的设置。我有一个Symfony2项目,我有一个数据库中的阶段列表,每个阶段可以是一个或多个类别。我需要从特定类别中获取所有阶段,并按相关排序顺序对其进行排序。如果我直接在mySQL中这样做,我会写:
SELECT s.stage FROM stage s LEFT JOIN stage_category sc ON sc.stage_id = s.id WHERE sc.category_id = 1 ORDER BY s.sort_order
但问题是," stage_category"连接表没有实体,所以如果我在我的Doctrine查询中引用它,它会告诉我它不存在。我写的是:
$qb = $this->createQueryBuilder('s')
->select('s')
->join('stage_category','sc')
->where('sc.category_id = :cat')
->setParameter('cat', $cat);
虽然,不完全确定这是否正确 - 但它在我的知识库中的一个名为findStagesInCategory()的方法中。
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Category", inversedBy="stage", cascade={"remove", "persist"})
* @ORM\JoinTable(name="stage_category")
* @ORM\JoinColumn(onDelete="SET NULL")
*/
private $category;
反过来说:
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\ManyToMany(targetEntity="Stage", mappedBy="category", cascade={"remove", "persist"})
*/
private $stage;
有没有合理的方式来获取我需要的数据?
答案 0 :(得分:6)
阶段和类别之间没有实体的原因是因为在该关系中没有任何其他证据证明实体的存在是正当的(这就是为什么它是一个多元化的原因)。
您要做的是获取联接并过滤关系:
$qb = $this->createQueryBuilder('s')
->select('s')
->join('s.category','c')
->where('c.category_id = :cat')
->setParameter('cat', $cat);
或者,如果stage_category
具有证明实体存在的属性,则可以将映射更改为一对多和多对一,这样您就可以执行原始使用查询构建器进行查询。