使用 Doctrine Query Builder 搜索多列

Search for multiple columns with Doctrine Query Builder

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

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

我有一个搜索词。假设它是 bunny,那么我想 return 在其任何列中包含单词 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 匹配到 return 该行中其他列的条目感到有点困惑和困惑。任何帮助将不胜感激。

你的知识库中有这样的东西 class。

public function search($searchTerm)
{
    return $this->createQueryBuilder('r')
        ->where('r.col1 LIKE :term OR r.col2 LIKE :term OR r.col3 LIKE :term')
        ->setParameter('term', '%' . $searchTerm . '%')
        ->getQuery()
    ;
}

并向您的实体添加注释以在您的列上添加索引:

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

并使用 CLI 对数据库进行更改

php bin/console doctrine:schema:update --force

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

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

借用 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 %'),它可以使用索引LIKE.