我有两个实体
Product
和Category
Product
有一个manyToMany
(单向)字段,其中Category
的加入表名为product_has_category
我可以轻松找到哪个Category
有Product
,但我不知道如何得到反...
我想说我希望在表单中获得某个Product
的所有Category
,该表单的字段为category
,因此我可以'使用Product
查询获取实体字段类型,否则将失败。
$form
->add('category', 'entity', array(
'class' => 'AppBundle\Entity\Category',
'property' => 'name',
'query_builder' => function(EntityRepository $em) use ($product) {
return $em
->createQueryBuilder('c')
->innerJoin('AppBundle\Entity\Product', 'p', 'WITH', 'p.id = :product_id')
->setParameter('product_id', $product->getId())
;
},
'multiple' => true
))
;
当然这不起作用,但你知道我想做什么。由于Category
没有Product
的任何映射字段(因为它是单向映射),我无法找到简单的产品...
中间表没有实体,因为我们不需要它,它只是一个mysql表。
运行MySQL查询会很容易,但我们需要它在QueryBuilder中,因为我们将在表单中使用它。
SELECT c.name
FROM category c
INNER JOIN product_has_category pc ON pc.category_id = e.id
INNER JOIN product p ON pc.product_id = p.id
WHERE p.id = 10
;
这当然正确地归还了我想要的东西,因为在MySQL上我可以访问中间表,所以我可以加入所有东西......但是,QueryBuilder?我不知道
我已经尝试了这个,但我只是冻结了所有东西(我想是超过7M的记录)
$em
->createQueryBuilder('c')
->select('c')
->innerJoin('AppBundle\Entity\Product', 'p', 'WITH', '1 = 1')
->innerJoin('p.categories', 'c')
->where('p.id = :product_id')
->setParameter('product_id', $product->getId())
;
我认为它没有重复,因为其他问题不包含QueryBuilder
解决方案/问题,而且有些人可能会对如何这样做感到困惑。
答案 0 :(得分:0)
对于蚂蚁谁知道如何在QueryBuilder中做到这一点,感谢@jkavalik回答引用其他问题
Doctrine 2 DQL - how to select inverse side of unidirectional many-to-many query?
这是我用过的代码,就像魅力一样。
$form
->add('categories', 'entity', array(
'class' => 'AppBundle\Entity\Category',
'property' => 'name',
'query_builder' => function(EntityRepository $em) use ($product) {
return $em
->createQueryBuilder('c1')
->innerJoin('AppBundle\Entity\Product', 'p', 'WITH', '1 = 1')
->innerJoin('p.equipments', 'c2')
->where('p.id = :product_id')
->andWhere('c1.id = c2.id')
->setParameter('product_id', $product->getId())
;
}
))
;