2014-04-25 77 views
0

我需要將原始查詢作爲字符串獲取,如下所示。如何從控制器獲取來自EntityRepository的原始查詢

$查詢= '選擇P檔FROM GabrielUploadBundle:圖像P WHERE p.upvotes> X ORDER BY p.createdAt ASC';

我的自定義「findAllNewestByVotes」方法包含查詢。

class ImageRepository extends EntityRepository 
{ 
    public function findAllNewestByVotes($maxvotes) 
    { 
     return $this->getEntityManager() 
     ->createQuery(
      'SELECT p FROM GabrielUploadBundle:Image p WHERE p.upvotes > '.$maxvotes.' ORDER BY p.createdAt ASC') 
     ->getResult(); 
    } 

} 
/** 
* @Route("/world/front",name="world-front") 
* @Template() 
*/ 
public function indexAction() 
{ 
    $images = $this->get('doctrine')->getRepository('GabrielUploadBundle:Image')->findAllNewestByVotes(50); 

    ladybug_dump($images); 
    return $this->render('GabrielLayoutBundle:Worldpage:index.html.twig',array('images'=>$images)); 
} 

我需要的是像 $圖像 - > getRawQuery()//返回查詢作爲字符串


解決方案(參考最好的答案)

/** 
    * ImageRepository 
    * 
    * This class was generated by the Doctrine ORM. Add your own custom 
    * repository methods below. 
    */ 
    class ImageRepository extends EntityRepository 
    { 
     public function findAllNewestByVotes($maxvotes) 
     { 
      return $this->getEntityManager() 
      ->createQuery(
       'SELECT p FROM GabrielUploadBundle:Image p WHERE p.upvotes > '.$maxvotes.' ORDER BY p.createdAt ASC'); 
     } 
    } 

> create image repository 

    $images = $this->get('doctrine')->getRepository('GabrielUploadBundle:Image')->findAllNewestByVotes(50); 
return the raw query as string like this 
$images->getDQL() 
return objects like this 
$images->getResult(); 
+0

查詢作爲字符串是相當無用的,除非你正在考慮追加到它作爲一個字符串,它是醜陋的,因爲教義有這麼多容易的動態構建SQL查詢使用功能。 –

+0

如果它沒用,他們就不會創建getDQL()方法 (查看答案) – user3531149

+0

對我們來說這是沒用的 - 圖書館的受益者/用戶 - 它對於較低級別的工作很有用。 –

回答

3

原始查詢可以使用檢索到:

$this->getEntityManager() 
    ->createQuery(' 
     SELECT p 
      FROM GabrielUploadBundle:Image p 
      WHERE p.upvotes > '.$maxvotes.' 
      ORDER BY p.createdAt ASC 
    ') 
    ->getSQL(); 

但是,這是一個簡單的查詢,爲什麼不使用DQL和單獨添加的參數(使用準備語句,其從SQL注入攻擊是安全的)?

$this->getEntityManager() 
    ->createQueryBuilder() 

    ->select('p') 
    ->from('GabrielUploadBundle:Image') 

    ->where('p.upvotes > :maxvotes') 
    ->setParameter('maxvotes', $maxvotes) 

    ->orderBy('p.createdAt', 'ASC') 

    ->getSQL(); 

爲了能夠得到你需要打破庫邏輯到2個功能,其中一個建立查詢控制器查詢(對象)或查詢生成器(對象),而另一個調用與參數查詢:

class ImageRepository extends EntityRepository 
{ 
    public function findAllNewestByVotesQuery($maxvotes) 
    { 
     return $this->getEntityManager() 
      ->createQueryBuilder() 

      ->select('p') 
      ->from('GabrielUploadBundle:Image') 

      ->where('p.upvotes > :maxvotes') 
      ->setParameter('maxvotes', $maxvotes) 

      ->orderBy('p.createdAt', 'ASC'); 
    } 

    public function findAllNewestByVotes($maxvotes) 
    { 
     return $this 
      ->findAllNewestByVotesQuery($maxvotes) 
      ->getQuery() 
      ->getResult(); 
    } 
} 
+0

有沒有辦法從控制器獲取它,而不必爲每個控制器重新輸入字符串?在這種情況下像$ image-> getSQL()什麼的? – user3531149

+0

將其分解爲兩個函數 - 一個構建查詢並且一個調用它。您應該在每個存儲庫中執行此操作,以便無需複製粘貼代碼即可輕鬆更改查詢。 –

+0

先生因爲第二個函數拋出一個異常試圖自我調用,我不會限定它作爲一個工作答案,但是我看你的答案是如何有用,所以只接受編輯,並已完成 – user3531149

相關問題