在使用doctrine 2的查询中使用“like”结果

时间:2012-07-18 02:21:40

标签: sql symfony doctrine-orm

在我的新闻网页中,我希望使用主要新闻中引用的“关键字”以及使用此查询的相关新闻:

   public function RelatedNews($limit,$offset=0,$keywords)

  {    
     $q = $this->_em->createQueryBuilder();
         $q->select('n.title,n.shortContent,n.longContent,n.keywords')
           ->from('MyAppMyBundle:News', 'n')
            ->where($q->expr()->like('n.keywords', $q->expr()->literal('%' . $keywords . '%')))
              ->setFirstResult( $offset )
              ->setMaxResults( $limit );  

    return $q->getQuery()->getResult();

  }

查询是正确的,但只是当它找到一个关键字时,当我放置一个单词列表时,我的结果是错误的

在我的“新闻”表中,我有一行“关键字”,我存储了我的关键字:

word 1 , word 2 , word 3 ...

所以我希望在查询在单词列表中找到单词时得到结果...

1 个答案:

答案 0 :(得分:1)

LIKE%value%将匹配包含子字符串'value'的任何字符串。

因此,如果输入的关键字字符串恰好是其中一个新闻项的关键字的子字符串,则问题中的查询只会导致多个关键字匹配。

例如,如果你有一个带有keywords =“cycling,france,wiggins”的新闻项目,那么如果你输入“骑自行车,法国”或“法国,wiggins”而不是“骑自行车,摇摆”或甚至“骑自行车,法国”或“骑自行车法国”。

如果您更改传入的$ keywords字符串的值以使用%wildcard char分隔关键字,那么您应该获得您要查找的匹配项。

例如,如果你将“骑行,摇摆”转换为“%cycling%wiggins%”,那么它将匹配“骑自行车,法国,威金斯”。

然而,请注意,使用这种LIKE方法查询“fran,gin”也会匹配“骑自行车,法国,wiggins”。要匹配整个关键字,更好的方法是将关键字单独存储在单独的表中,并使用不同类型的查询。