2012-10-25 2 views
1

하나의 Doctrine 2 쿼리에서 LIKE 와일드 카드를 사용하여 일치시키려는 용어가 있습니다. 데이터베이스가 SQL이고 DQL을 사용하고 있지만 쿼리 빌더 솔루션이 좋을 것입니다. 내 현재 쿼리 설정은 이것이다 :Doctrine & Symfony 2.1에서 좋아하는 배열로 쿼리하기

foreach($textterms as $text) 
{ 
$parameters[] = '%-'.$text.'-%'; 
} 

$em = $this->getDoctrine()->getManager(); 
$query = $em->createQuery(
'SELECT p FROM Post p WHERE p.searchfield IN LIKE (:text) ORDER BY p.datetime DESC' 
     )->setParameter('text', $parameters); 
     $posts = $query->getResult(); 

하지만 심포니 오류를 얻을

인가 "QueryException : 리터럴 예상 얻었다 '('[구문 오류] 라인 0, COL 62 : 오류" 교리 가능이 쿼리

답변

1

쿼리 LIKE 문 다음 값을 기대하고 있기 때문에 이러한 오류가 발생하고 내가 고려할 것 "LIKE IN"가능한 솔루션과 같은 그런 일 없다?..

// Query Builder added to show difference in code readability I personally use queryBuilder mostly 
$query = $this->getDoctrine()->getManager()->createQueryBuilder(); 
$query->select('p') 
     ->from('Post', 'p') 
     ->orderBy('p.datetime', 'DESC'); 
$i = 0; 
$parameters = array(); 
foreach ($textterms as $key => $text) 
{ 
    $query->orWhere('p.searchfield LIKE ?' . $i++); 
    $parameters[] = '%-' . $text . '-%'; 
} 
$query->setParameters($parameters); 
$posts = $query->getQuery()->getResult(); 

// Query 
$orX = new \Doctrine\ORM\Query\Expr\Orx(); 
$i = 0; 
$parameters = array(); 
foreach ($textterms as $text) 
{ 
    $orX->add('p.searchfield LIKE ?' . $i++); 
    $parameters[] = '%-' . $text . '-%'; 
} 
$orX = (string)$orX; 
if(!empty($orX)) 
{ 
    $orX = 'WHERE ' . $orX; 
} 
$sql = sprintf('SELECT p FROM Post p %s ORDER BY p.datetime DESC', $orX); 
$query = $this->getDoctrine()->getManager()->createQuery($sql); 
$query->setParameters($parameters); 
$posts = $query->getResult(); 
+0

안녕하세요, 귀하의 쿼리 빌더 솔루션을 가지고 놀았습니다. \t \t \t foreach ($ texterms as $ text) {$ query-> orWhere ('p.searchfield LIKE?'. $ i ++); $ parameters [] = '% -' . $ text. '- %';} 하지만 어떤 이유로 질의가 심포니 로거에서 처리되는 것처럼 보이지만 게시물 배열에는 아무 것도 없습니다. – Joe

+0

어떻게 -> setparameters가 작동하는지 알 수 없습니다. key => 값의 배열이 될 예정입니까? $ parameters [i] = '% -'을 시도 할 때. $ text. '- %'; "잘못된 매개 변수 : 토큰 15가 쿼리에 정의되어 있지 않습니다."라는 오류 메시지가 나타납니다. 도움을 주셔서 감사합니다. – Joe

+1

[setParameters 사용법에 대한 좀 더 명확한 예] (http://docs.doctrine-project.org/en/2.0). 당신이'$ parameters [$ i]'를 사용한다면 x/reference/query-builder.html # binding-parameters-to-your-query) 값이 있기 전에 이미'$ i ++' '$ parameters'에 추가됩니다. 오류가 발생하면'$ parameters [15] = value; '를 배열에 쓰는 동안 어디에서? 디버깅 목적으로'echo $ query-> getQuery() -> getSQL();'과'var_dump ($ parameters); '를 시도해보십시오. –

관련 문제