我有两个与多对多关系的实体(汽车和经销商)。 我有一个有效的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
答案 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就是我上面发布的那个。结果是一样的!!
您可以像我一样提供有关结果的更多信息吗?