Doctrine2 manyToMany Inverse QueryBuilder

时间:2015-10-26 12:44:57

标签: php mysql symfony doctrine-orm

我有两个实体

ProductCategory

Product有一个manyToMany(单向)字段,其中Category的加入表名为product_has_category

我可以轻松找到哪个CategoryProduct,但我不知道如何得到反...

我想说我希望在表单中获得某个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解决方案/问题,而且有些人可能会对如何这样做感到困惑。

1 个答案:

答案 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())
            ;
        }
    ))
;