2013-02-26 54 views
1

我在Symfony2中將一個值傳遞給Doctrine2 QueryBuilder時出現問題。 我有兩個Entyties加入單向ManyToMany關係: 文章和標籤,它工作正常,但當我嘗試傳遞一個值到qb參數它讀取錯誤字面得到'ORDER'或什麼也沒有(但記錄存在) 。 代碼:Doctrine2多對多訪存行問題

$em=$this->getDoctrine()->getEntityManager()->getRepository('Bundle:Articles'); 
$qb = $em->createQueryBuilder('l') 
     ->select('l,t') 
     ->leftJoin('l.tags', 't') 
     ->where('1=1') 
     ->orderBy('l.titol', 'ASC'); 

if(isset($criteria['Titol']) && !empty($criteria['Titol']) && 
    strlen(trim($criteria['Titol']))){ 
     $qb->andWhere('l.titol like :titol') 
      ->setParameter('titol','%'.$criteria['Titol'].'%'); 
} 

if(isset($criteria['includeRecurs']) && 
    !empty($criteria['includeRecurs']) && 
    trim($criteria['includeRecurs']=='recurs')){ 
     $qb->andWhere('trim(l.urlMicroSite) !=\'\' and l.urlMicroSite is not null'); 
} 

if(isset($criteria['tag']) && is_array($criteria['tag']) && count($criteria['tag'])){ 
    foreach($criteria['tag'] as $k=>$v){ 
     $qb->andWhere('t.id=:'.$k)->setParameter($k,$criteria['tag'][$k]); 
    } 
} 

的問題是在最後分配,另一種工作:

$qb->andWhere('t.id=:'.$k)->setParameter($k,$v); 

如果我設置手動變量$ V例如:的setParameter($ K,3)或的setParameter( $ k,'3')它工作正常......但如果我設置值$ v = 3然後調用代碼,它不會得到任何東西(也不會出錯)。 如果我直接設置andWhere條件,例如andWhere('t.id ='。$ v),它會讀取錯誤,其中的字面值爲'ORDER',對其值再次運行的值進行硬編碼。 我很確定$ v是正確的(var_dump,echo等)。 任何幫助將apreciated(和我的英語很抱歉)

+0

您應該先記錄SQL語句並查看傳遞給SQL層的內容。 – Ocramius 2013-02-26 17:44:46

+0

您好奧克拉米斯,這裏的SQL日誌,我試了三個案件,似乎是t.id中的參數重複,我不明白。 – tero 2013-02-27 09:46:07

回答

0

那麼由於發佈的空間,我需要在這裏發佈: 情況1個查詢與原始參數,沒有結果:

--no results (parameter $v) 
    SELECT l0_.ISBN AS ISBN0, l0_.EAN AS EAN1, l0_.numeroPagines AS numeroPagines2, 
    l0_.preuLlibre AS preuLlibre3, 
    l0_.format AS format4, 
    l0_.dataPublicacio AS dataPublicacio5, 
    l0_.titolOriginal AS titolOriginal6, 
    l0_.disenyCoberta AS disenyCoberta7, 
    l0_.ilustrador AS ilustrador8, l0_.coleccio AS coleccio9, l0_.versioDe AS versioDe10, 
    l0_.descripcioCurta AS descripcioCurta11, l0_.urlMicroSite AS urlMicroSite12, 
    l0_.visibleInici AS visibleInici13, l0_.titol AS titol14, l0_.autor AS autor15, 
    l0_.descripcio AS descripcio16, l0_.imatge AS imatge17, l0_.id AS id18, 
    l0_.idUsuariCreacio AS idUsuariCreacio19, l0_.dataCreacio AS dataCreacio20, 
    l0_.idUsuariModificacio AS idUsuariModificacio21, 
    l0_.dataModificacio AS dataModificacio22, 
    l0_.userLock AS userLock23, 
    t1_.nomTag AS nomTag24, 
    t1_.tipusTag AS tipusTag25, 
    t1_.id AS id26, 
    t1_.idUsuariCreacio AS idUsuariCreacio27, 
    t1_.dataCreacio AS dataCreacio28, 
    t1_.idUsuariModificacio AS idUsuariModificacio29, 
    t1_.dataModificacio AS dataModificacio30, 
    t1_.userLock AS userLock31 
    FROM Llibre l0_ LEFT JOIN llibre_tag l2_ 
     ON l0_.id = l2_.llibre_id 
    LEFT JOIN Tags t1_ 
     ON t1_.id = l2_.tag_id 
    WHERE 1 = 1 
     AND t1_.id = '3' 
     **AND t1_.id = ''** <-- empty duplicated parameter (but why duplicated??) 
    ORDER BY l0_.titol ASC 

同樣在這裏查詢與參數$ v = 3硬編碼

--1 result as expected (parameter $v) 
    SELECT l0_.ISBN AS ISBN0, l0_.EAN AS EAN1, l0_.numeroPagines AS numeroPagines2, 
    l0_.preuLlibre AS preuLlibre3, 
    l0_.format AS format4, 
    l0_.dataPublicacio AS dataPublicacio5, 
    l0_.titolOriginal AS titolOriginal6, 
    l0_.disenyCoberta AS disenyCoberta7, 
    l0_.ilustrador AS ilustrador8, l0_.coleccio AS coleccio9, l0_.versioDe AS versioDe10, 
    l0_.descripcioCurta AS descripcioCurta11, l0_.urlMicroSite AS urlMicroSite12, 
    l0_.visibleInici AS visibleInici13, l0_.titol AS titol14, l0_.autor AS autor15, 
    l0_.descripcio AS descripcio16, l0_.imatge AS imatge17, l0_.id AS id18, 
    l0_.idUsuariCreacio AS idUsuariCreacio19, l0_.dataCreacio AS dataCreacio20, 
    l0_.idUsuariModificacio AS idUsuariModificacio21, 
    l0_.dataModificacio AS dataModificacio22, 
    l0_.userLock AS userLock23, 
    t1_.nomTag AS nomTag24, 
    t1_.tipusTag AS tipusTag25, 
    t1_.id AS id26, 
    t1_.idUsuariCreacio AS idUsuariCreacio27, 
    t1_.dataCreacio AS dataCreacio28, 
    t1_.idUsuariModificacio AS idUsuariModificacio29, 
    t1_.dataModificacio AS dataModificacio30, 
    t1_.userLock AS userLock31 
    FROM Llibre l0_ LEFT JOIN llibre_tag l2_ 
     ON l0_.id = l2_.llibre_id 
    LEFT JOIN Tags t1_ 
     ON t1_.id = l2_.tag_id 
    WHERE 1 = 1 
     AND t1_.id = '3' 
     **AND t1_.id = '3'** 
    ORDER BY l0_.titol ASC 

最後與不重複的其他參數的查詢..

--1 result as expected (parameter $v=4,$title="%quil%") 
SELECT l0_.ISBN AS ISBN0, l0_.EAN AS EAN1, l0_.numeroPagines AS numeroPagines2, 
l0_.preuLlibre AS preuLlibre3, 
l0_.format AS format4, 
l0_.dataPublicacio AS dataPublicacio5, 
l0_.titolOriginal AS titolOriginal6, 
l0_.disenyCoberta AS disenyCoberta7, 
l0_.ilustrador AS ilustrador8, l0_.coleccio AS coleccio9, l0_.versioDe AS versioDe10, 
l0_.descripcioCurta AS descripcioCurta11, l0_.urlMicroSite AS urlMicroSite12, 
l0_.visibleInici AS visibleInici13, l0_.titol AS titol14, l0_.autor AS autor15, 
l0_.descripcio AS descripcio16, l0_.imatge AS imatge17, l0_.id AS id18, 
l0_.idUsuariCreacio AS idUsuariCreacio19, l0_.dataCreacio AS dataCreacio20, 
l0_.idUsuariModificacio AS idUsuariModificacio21, 
l0_.dataModificacio AS dataModificacio22, 
l0_.userLock AS userLock23, 
t1_.nomTag AS nomTag24, 
t1_.tipusTag AS tipusTag25, 
t1_.id AS id26, 
t1_.idUsuariCreacio AS idUsuariCreacio27, 
t1_.dataCreacio AS dataCreacio28, 
t1_.idUsuariModificacio AS idUsuariModificacio29, 
t1_.dataModificacio AS dataModificacio30, 
t1_.userLock AS userLock31 
FROM Llibre l0_ LEFT JOIN llibre_tag l2_ 
    ON l0_.id = l2_.llibre_id 
LEFT JOIN Tags t1_ 
    ON t1_.id = l2_.tag_id 
WHERE 1 = 1 
    AND l0_.titol LIKE '%quil%' 
    AND t1_.id = '3' 
    **AND t1_.id = '3**' 
ORDER BY l0_.titol ASC 
+0

好吧,找到我的邏輯錯誤! – tero 2013-02-27 11:10:27