【问题标题】:Symfony 3 : Select with relation many to manySymfony 3:选择关系多对多
【发布时间】:2017-11-09 15:26:01
【问题描述】:

我有两个具有多对多关系的实体(汽车和经销商)。 我有一个有效的 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

【问题讨论】:

  • 为空,因为表dealer_car 上的所有关系都与dealer 16 相关。尝试与其他dealer 添加另一行并发布您的结果。

标签: php symfony dql


【解决方案1】:

改变你的查询怎么样?

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;

【讨论】:

  • 我只是在 DQL 中而不是在 SQL 中执行我的 SQL 请求,因为我在 EntityType 中使用 DQL 请求的答案
  • 好的,你可以这样修改你的DQL))
【解决方案2】:

我想您正在尝试获取与 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 就是我在上面发布的那个。结果是一样的!!

你能像我一样提供更多关于你的结果的信息吗?

【讨论】:

  • 你知道我搜索的是“获取与 id=16 经销商无关的汽车”,但不幸的是,这个请求不起作用
  • 我已经编辑了我的答案,提供了更多信息......和一个例子
猜你喜欢
  • 2017-11-11
  • 2017-04-07
  • 2018-03-04
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多