2012-09-11 47 views
0

我试图执行一个简单的查询,但我不明白我的错误在哪里。请帮忙!错误的查询 - Doctrine2/Symfony2

这是仓库类:

public function searchFriends ($param) 
    { 
     return $this->getEntityManager() 
      ->createQuery('SELECT f FROM EMMyFriendsBundle:Friend f WHERE f.name='.$param) 
      ->getResult(); 
    } 

这就是我如何把它从控制器的行动:

$em = $this->getDoctrine()->getEntityManager(); 
$result = $em->getRepository('EMMyFriendsBundle:Friend') 
       ->searchFriends($search->getWords()); 

当它以这种方式,我得到以下错误:

[Semantical Error] line 0, col 54 near 'Maria': Error: 'Maria' is not defined. 
500 Internal Server Error - QueryException 

我试图用这种方式将搜索值放在引号中:

public function searchFriends ($param) 
    { 
     return $this->getEntityManager() 
      ->createQuery('SELECT f FROM EMMyFriendsBundle:Friend f WHERE f.name=" '.$param ' " ') 
      ->getResult(); 
    } 

但后来我得到

[Syntax Error] line 0, col 59: Error: Expected end of string, got ' " ' 
500 Internal Server Error - QueryException 

你能告诉我如何正确地编写查询?提前致谢!


编辑

我也试过这样:

public function searchFriends ($param) 
{ 
    $q = $this 
     ->createQueryBuilder('f') 
     ->where('f.name = :name') 
     ->setParameter('name', $param) 
     ->getQuery(); 

    return $q->getResult(); 
} 

与此:

$em = $this->getDoctrine()->getEntityManager(); 
$result = $em->getRepository('EMMyFriendsBundle:Friend') 
       ->searchFriends($search->getWords()); 

,它的workiiing

回答

2

尽管我不会使用这种将参数传递给查询的方式(检查this),但是您的错误在于您构建缺少点的字符串。它应该是这样的:

public function searchFriends ($param) 
    { 
     return $this->getEntityManager() 
      ->createQuery('SELECT f FROM EMMyFriendsBundle:Friend f WHERE f.name="'.$param.'"') 
      ->getResult(); 
    } 
+0

当点是存在的,错误是[语法错误] 0行,列59:错误:预期年底'':(我会尝试另一种方式, – Faery

+0

你现在的代码如何?你犯了类似的错误...... – adosaiguas

+0

当我复制代码时,你给出的错误仍然是[Syntax Error]行0,col 54:Error:Expected Literal,got''' – Faery

1

您需要使用的文字表达式:

public function searchFriends($param) 
{ 
    $qb = $this->createQueryBuilder('f') 
     ->where($qb->expr()->eq('f.name', $qb->expr()->literal($param))); 

    return $qb->getQuery()->getResult(); 
}