不确定这里的标题是否有点模棱两可,但基本上我要做的是从数据库中获取数据,但我需要引用一个没有自己的实体的连接表,因为它只在另一个实体中引用。
这是我的设置。我有一个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;
是否有任何合理的方法可以获取我需要的数据?
之所以在
阶段和类别之间没有实体,是因为在该关系中没有其他任何东西可以证明实体的存在是合理的(这就是为什么它是一个多对多)。
您要做的是获取联接并过滤关系:
$qb = $this->createQueryBuilder('s')
->select('s')
->join('s.category','c')
->where('c.category_id = :cat')
->setParameter('cat', $cat);
或者,如果stage_category
具有证明实体存在合理的属性,则可以将映射更改为一对多和多对一,这将允许您使用查询生成器执行原始查询。