如何在queryBuilder中使用连接表(ManyToMany关系)

时间:2014-04-14 20:53:48

标签: symfony doctrine-orm

我有一个双向的ManyToMany关系:Team< =>锦标赛与Championships_teams联赛。

我想首先获得所有团队和团队的订单。

一个简单的SQL查询来获取这个可以是:(在Mysql null中首先出现)

select * 
from team left join championships_teams
            on id=team_id
            and championship_id=:specific_id
order by championship_id desc

我尝试使用查询构建器但没有成功 我可以使用查询构建器执行此类查询而不将championships_teams映射为实体吗?

2 个答案:

答案 0 :(得分:0)

看看我对这个问题的回答 - symfony2 doctrine findBy id in arrayCollection

这似乎是一个类似的问题。您需要使用'会员资格'改性剂。

答案 1 :(得分:0)

我终于解决了我的麻烦:通过带有null值的查询来命令在表单中使用结果。

  1. 我们无法通过DQL访问关系表:How do you join two tables in Doctrine2 using Query Builder if the table relationships are not setup?。但是我不能使用本机查询,因为我想让QueryBuilder对象以实体形式使用它。
  2. 进行符合DQL的SQL查询。

    SELECT t.*,IFNULL(c.year,0) as year
    FROM Team t LEFT JOIN championships_teams ct 
            ON t.id = ct.team_id 
        LEFT JOIN Championship c 
            ON c.id = ct.championship_id 
            AND c.id = 76 
    WHERE e.league_id = 1
    ORDRE BY year;
    
  3. 使用HIDDEN字How can I order by NULL in DQL?传递错误Expected argument of type "object or array", "string" given。最后得到我的DQL查询:

    $qb = $this->createQueryBuilder('t')        
                ->leftJoin('t.championships', 'c',Expr\Join::WITH,'c.id = :champ_id' )
                ->setParameter('champ_id', $champ->getId())
                ->addSelect('IFNULL(-c.year,0) as HIDDEN year')
                ->where('t.league=:league_id')      
                ->setParameter('league_id', $champ->getLeague())
                ->addorderBy('year')
                ->addorderBy('t.nom');
    return $qb;
    
  4. 我认为我的问题没有很好地表达出来。希望这可以帮助别人。