2014-02-28 43 views
0

我需要檢查表中是否存在多個項目。問題是我必須檢查兩個字段連接成字符串的字符串,如果我想一起檢查名字和姓氏,但單獨存儲它們。我是新來的學說,並在主題廣泛的研究之後,我嘗試了兩種方式:Doctrine DQL(Symfony2) - WHERE級聯字段是IN params

$params = array('two words', 'another here'); 

// writing the DQL 
$query = $this->getEntityManager() 
    ->createQuery(" 
     SELECT foo.f1, foo.f2 
     FROM MyCompanyMyBundle:MyEntity foo 
     WHERE CONCAT(CONCAT(foo.f1, ' '), foo.f2) IN (:params) 
    ")->setParameter('params', implode(', ', $params)); 

注意:雙CONCAT需要becouse CONCAT_WS不主義的支持。

這應該工作(imo)但是:params被替換爲一個 string('two words,another here'),不是由逗號分隔的一系列字符串。 (我試過在$ params中的元素周圍單獨引用單引號,但這也不起作用,它被Docrine('\'兩個單詞'','另一個這裏'))所逃脫。

// trying the query builder 

$qb = $this->createQueryBuilder('foo'); 
$query = $qb 
    ->select(array('foo.f1', 'foo.f2')) 
    ->where(
     $qb->expr()->in(
      $qb->expr()->concat($qb->expr()->concat('foo.f1', ' '), 'foo.f2'), 
      ':params' 
     ) 
    ) 
    ->setParameter('params', implode(', ', $params)) 
    ->getQuery(); 

我猜我甚至沒有接近查詢生成器,所以如果這是要走的路我欣賞任何幫助!

所以我的目標是返回兩列值正確在一起的行。

哪一條路要走,我做錯了什麼?

+1

當使用'的setParameter()'上的一個參數的' IN(...)'子句中,您應該直接傳遞數組 - 'setParameter('params',$ params)'。這可能會或可能無法解決您的問題。 – Jez

+0

它的工作原理!如果你把它作爲答案發布,我很樂意接受它。謝謝! – hattila

+0

認爲會有更多,但我一定會發表一個答案。謝謝。 – Jez

回答

3

貌似問題是你使用setParameter()IN(...)條款的方式 - 你應該通過一個數組,而不是內爆 -

$params = array('two words', 'another here'); 

// writing the DQL 
$query = $this->getEntityManager() 
    ->createQuery(" 
     SELECT foo.f1, foo.f2 
     FROM MyCompanyMyBundle:MyEntity foo 
     WHERE CONCAT(CONCAT(foo.f1, ' '), foo.f2) IN (:params) 
    ")->setParameter('params', $params); 
+0

我不知道爲什麼這不在文檔中列出: [http://docs.doctrine-project.org/en/2.0.x/reference/query-builder.html#binding-parameters-to-您的查詢(http://docs.doctrine-project.org/en/2.0.x/reference/query-builder.html#binding-parameters-to-your-query) – hattila