1

在我的新闻网页中,我想使用主要新闻中引用的“关键字”获得相关新闻,并且我使用此查询:

   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 ...

所以我希望当查询在单词列表中找到一个单词时有结果......

4

1 回答 1

1

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

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

例如,如果您有一个关键字为“cycling,france,wiggins”的新闻项目,那么如果您输入“cycling,france”或“france,wiggins”而不是“cycling,wiggins”甚至“cycling”,您将获得匹配,法国”或“骑车法国”。

如果您更改传入的 $keywords 字符串的值以使用 % 通配符分隔关键字,那么您应该得到您正在寻找的匹配项。

例如,如果您将“cycling, wiggins”转换为“%cycling%wiggins%”,那么它将匹配“cycling,france,wiggins”。

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

于 2012-07-18T15:02:12.093 回答