2012-10-25 32 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(); 

,但我得到symfony的错误 “QueryException:语法错误] 0行,列62:错误:预期文字,得到了 '('”

是此查询可能在教义

回答

1

您会收到这样的错误,因为查询期待LIKE语句后的值有没有这样类似“像”可能的解决办法的事,我会考虑:。

// 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。 ' - %';} 但由于某些原因,即使查询似乎要经过symfony记录器,也没有任何内容放入posts数组中。 – Joe

+0

我无法找到 - > setparameters是为了工作。是否意味着是一个key =>值的数组?当我尝试$参数[我] ='% - '。 $ text。 ' - %';我收到错误“Invalid parameter:token 15 is not defined in the query。”感谢您的帮助 – Joe

+1

[一个更清晰的setParameters用法示例](http://docs.doctrine-project.org/en/2.0。 x/reference/query-builder.html#binding-parameters-to-your-query)如果你正在使用'$ parameters [$ i]'请记住我已经在$ i ++'添加到'$ parameters'中,如果出现错误,很可能是因为在执行'$ parameters [15] = value;'时在数组中使用了?14。 为了进行调试,最后尝试'echo $ query-> getQuery() - > getSQL();''和'var_dump($ parameters);' –