1

Symfony2 で Doctrine2 QueryBuilder に値を渡す際に問題があります。Articles と Tags という一方向の ManyToMany 関係で結合された 2 つのエンティティがあり、正常に動作しますが、qb パラメーターに値を渡そうとすると、Error espetcted Literal got 'ORDER' または get Nothing (レコードが存在します) と表示されます。コード:

$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 など)。どんな助けも高く評価されます(そして私の英語で申し訳ありません)

4

1 に答える 1

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
于 2013-02-27T10:01:16.930 に答える