2015-07-21 76 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的建議。 –