Symfony 3:选择多对多的关系

时间:2017-11-09 15:26:01

标签: php symfony dql

我有两个与多对多关系的实体(汽车和经销商)。 我有一个有效的SQL请求:

Select c.id, c.nom FROM car as c WHERE   c.id NOT IN  
(Select car_id FROM dealer_car where dealer_id =  16);

但是使用querybuilder我不能这样做,因为dealer_car是多对多关系的表。

实际上我有这个查询生成器返回完全相反的

'query_builder' => function(EntityRepository $er) use ($options){
                    return $er->createQueryBuilder('c')
                        ->innerJoin('c.dealer','d')
                        ->andWhere('c.id  NOT IN (Select d.id FROM Bundle:Dealer de where de.id = :id)')
                        ->setParameter('id',$options['data']->getId());
                }
  

修改

我的数据库中有以下数据

Car
1;BMW
2;Tesla
3;Mercedes
4;Toyota

dealer_car
16;2
16;3

dealer
1;Johnny
2;David
16;Nelson

以下Query的结果为空

select c.id, c.name,d.name from car c join dealer_car dc on c.car_id=c.id join dealer d on dc.d_id=d.id where d.id!=16

2 个答案:

答案 0 :(得分:0)

如何更改查询?

SELECT c.id, c.nom FROM car AS c LEFT OUTER JOIN dealer_car AS dc ON c.id = dc.car_id AND dc.dealer_id = 16 WHERE dc.dealer_id IS NULL;

答案 1 :(得分:0)

我想你正试图让与id = 16的经销商无关的汽车。这应该适合你。

 $qb->select('c.id,c.nom')
            ->join('c.dealer','d')
            ->where($qb->expr()->neq('d.id',':delearId'))
            ->setParameter('dealerId',$dealerId)
            ->getQuery()
            ->getResult();

子查询返回与经销商id = 16相关联的汽车。为了简化查询,您只需要进行连接并从经销商处排除id = 16。更像是一个直接的问题

您正在请求类似的东西:给我一些与经销商16正在使用的汽车不同的汽车

我正在请求类似(直接)的东西:给我经销商16没有使用的汽车。

希望有所帮助

  

修改

我已经制作了这些tables: 这将是您的查询:

select c.id, c.carname FROM car c WHERE   c.id NOT IN  
(Select car_id FROM dealer_has_car where dealer_id =  16);

结果:

1;"car1"
2;"car2"
3;"car4"
4;"car3"
7;"car7"
8;"car8"
9;"car9"
10;"car10"

这将是我的查询

select c.id, c.carname,d.name from car c join dealer_has_car dhc on dhc.car_id=c.id join dealer d on dhc.dealer_id=d.id where d.id!=16

结果

1;"car1";"dealer1"
2;"car2";"dealer1"
3;"car4";"dealer2"
4;"car3";"dealer2"
7;"car7";"dealer3"
8;"car8";"dealer4"
9;"car9";"dealer4"
10;"car10";"dealer5"

你可以看到查询工作正常,我的SQL的DQl就是我上面发布的那个。结果是一样的!!

您可以像我一样提供有关结果的更多信息吗?