2015-07-21 59 views
2

转换MySQL查询我不能转换此查询:无法使用学说DQL或QueryBuilder的

SELECT c.title, COUNT(*), 
(
    SELECT ba_thumb.link 
    FROM ba_video 
    INNER JOIN video_channel ON video_channel.video_id=ba_video.id 
    INNER JOIN ba_thumb ON ba_thumb.video_id=video_channel.video_id 
    INNER JOIN ba_channel ON ba_channel.id=video_channel.channel_id 
    WHERE video_channel.channel_id=c.id 
    ORDER BY ba_video.views DESC, ba_thumb.id ASC 
    LIMIT 1 
) AS ba_thumb_link 
FROM ba_channel c 
INNER JOIN video_channel ON video_channel.channel_id=c.id 
INNER JOIN ba_video ON ba_video.id=video_channel.video_id 
GROUP BY video_channel.channel_id 
ORDER BY COUNT(*) DESC 

到DQL或使用QueryBuilder的。

我试着在DQL:

return $this->_em->createQuery(' 
      SELECT c.title, COUNT(*), 
      (
       SELECT t.link 
       FROM BAVideoGalleryBundle:Video v 
       INNER JOIN v.channels c 
       INNER JOIN v.thumbs t 
       WHERE c.id=mc.id 
       ORDER BY v.views DESC, t.id ASC 
       LIMIT 1 
      ) 
      FROM BAVideoGalleryBundle:Channel mc 
      INNER JOIN BAVideoGalleryBundle:Video mv 
      GROUP BY mv.Channels.id 
      ORDER BY COUNT(*) DESC') 
      ->getResult(); 

我得到:

"[Syntax Error] line 0, col 216: Error: Expected Doctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS, got 'LIMIT' "

,我尝试使用的QueryBuilder:

$query = $this->getEntityManager()->createQueryBuilder() 
    ->select('c.title, COUNT(*)') 
    ->from('BAVideoGalleryBundle:Channel', 'mc') 
    ->innerJoin('BAVideoGalleryBundle:Video', 'mv') 
    ->groupBy('mv.Channels.id') 
    ->orderBy('COUNT(*)', 'DESC'); 

$subquery = $this->getEntityManager()->createQueryBuilder() 
    ->select('t.link') 
    ->from('BAVideoGalleryBundle:Video', 'v') 
    ->innerJoin('v.channels', 'c') 
    ->innerJoin('v.thumbs', 't') 
    ->where('c.id=mc.id') 
    ->orderBy('v.views', 'DESC') 
    ->orderBy('t.id', 'ASC') 
    ->getQuery() 
    ->getResult(); 

return $query->addSelect('('.$subquery->getDql().')') 

但相关性不工作,我得到:

[Semantical Error] line 0, col 105 near 'mc.id ORDER BY': Error: 'mc' is not defined

+0

在你的app/logs中检查你的'dev.log'。或者检查你的MySQL一般查询日志,看看你的实际查询是从教条转换成的。 –

+1

LIMIT在DQL中不存在,您必须使用' - > setMaxResults(1)' –

+0

并使用setFirstResult(和setMaxResults)。然后做限制0,10,你将在查询结束.....-> orderBy('t.id','ASC') - > setFirstResult(0) - > setMaxResults(1) – Nico

回答

1

这是其中的主义ORM可能会导致更多问题而不是它解决的情况之一。你可以:

  1. 使用native query和相关ResultSetMapping设置
  2. 重构您的SQL查询到的东西,原则可以在DQL处理。看看你有的查询有很多不同的方法可以做到这一点(例如,将FROM子句作为FROM/JOIN部分中的一个临时表),但我看不到DTR允许的方式
  3. 使用Doctrine DBAL直接使用SQL。它看起来像你使用$this->_em这让我觉得你在EntityRepository,所以你可以这样做:$this->_em->getConnection()得到DBAL connection然后只是做$conn->query()。显然,这样你就失去了ORM(数据库不可知论等)的好处,但是你可以认为ORM具有执行复杂查询的税务。

我知道这些都不是理想的,但是从经验来看,有时候最好是推开Doctrine ORM来实现你所需要的。

+0

更常见不是,执行多个简单查询比具有多个连接和子选择的单个大查询要快。所以我赞同@ john-noel的建议。 –