首页 > 解决方案 > 使用 Doctrine Query Builder 搜索多个列

问题描述

我的列包含以下形式的条目:

col1    |   col2 |   col3
dog         123      bunny
cat         456      table
bunny       789      laptop

我有一个搜索词。假设它是bunny,那么我想返回bunny在其任何列中包含该单词的所有行。在这种情况下,这将是第 1 行和第 3 行。

所有列的格式为:

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $col1;

我还是学说查询构建器的新手,因此很难开始,但我认为它应该是以下形式(但也许我过于简单化了):

        foreach ($this->columns as $column)
        {
            // the problem is my columns don't have the entry property nor do I have the $row as an object
            $queryBuilder->andWhere($this->searchTerm = $column.entry)->select($row)
        }

所以我对如何实际获取行条目以及一旦它匹配searchTerm, 返回该行中其他列的条目有点困惑和困惑。任何帮助,将不胜感激。

标签: phpsymfonydoctrine-ormquery-builder

解决方案


LIKE搜索会起作用,只是它们通常要慢得多,因为它们必须访问行而不是索引。在比较器的两边使用通配符可以保证它不会使用带有LIKE^ 的索引。

但是,如果您使该字段FULLTEXT可搜索,您将获得更好的搜索工具,包括子字符串匹配。MySQL 5.6 之后的版本也允许您FULLTEXT在 InnoDB 上使用。

借用 Frank B 的回答,这里有类似的东西。别忘了跑

bin/console d:s:u --force

也是。

/**
 * @Entity
 * @Table(indexes={
       @Index(name="search_idx", flags={"fulltext"}, columns={"col1", "col2", "col3"})
   })
 */
class SomeEntity
{

...

class SomeEntityRepository
{
    public function search($searchTerm)
    {
        return $this->createQueryBuilder('r')
            ->where('MATCH(col1, col2, col3) AGAINST(:term IN NATURAL LANGUAGE MODE')
            ->setParameter('term', $searchTerm)
            ->getQuery()
        ;
    }

...

^ 如果该术语仅在右侧有一个通配符 ( 'brown %'),它可以使用一个索引来表示 a LIKE


推荐阅读