Php 使用条令查询生成器搜索多个列

Php 使用条令查询生成器搜索多个列,php,symfony,doctrine-orm,query-builder,Php,Symfony,Doctrine Orm,Query Builder,我有一些列包含以下形式的条目: col1 | col2 | col3 狗兔 456类表 兔子789笔记本电脑 我有一个搜索词。假设它是bunny,那么我想返回任何列中包含单词bunny的所有行。在本例中,这将是第1行和第3行 所有列的格式如下: /** *@ORM\Column(type=“string”,长度=255) */ 私人1美元; 我对条令查询生成器还是新手,因此很难开始,但我认为它应该是以下形式的(但可能我过于简单化了): 因此,我对如何实际获取行条目以及一旦它与searchTe

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

col1 | col2 | col3
狗兔
456类表
兔子789笔记本电脑
我有一个搜索词。假设它是
bunny
,那么我想返回任何列中包含单词
bunny
的所有行。在本例中,这将是第1行和第3行

所有列的格式如下:

/**
*@ORM\Column(type=“string”,长度=255)
*/
私人1美元;
我对条令查询生成器还是新手,因此很难开始,但我认为它应该是以下形式的(但可能我过于简单化了):


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

在您的Repository类中提供类似的帮助

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/控制台原则:模式:更新——强制


搜索一样有效,只是它们通常要慢得多,因为它们必须访问行而不是索引。在比较器的两侧使用通配符可以保证它不会使用类似于^的
索引

但是,如果使字段
全文
可搜索,则可以获得更好的搜索工具,包括子字符串匹配。5.6之后的MySQL也允许您在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%'
),它可能会使用一个索引作为

我不知道那些
会使用这些索引。我认为全文可能:
flags={“fulltext”}
MATCH(col1,col2,col3)与(“.escape($searchTerm)。””在自然语言模式下)
有没有一种方法不用索引我的实体就可以实现它?因为我有很多列,如果需要的话,我希望保持实体的形状不变possible@JaredFarrish我不知道你的意思,你能详细说明一下吗?@Doesitmatter-你拥有的越多,你需要索引的可能性就越大。我添加了另一个答案。不幸的是,这还返回了一个错误,即“表'SomeEntity'上没有名为'col1'的列”。“有没有办法避免逐个添加列?”?因为我有很多,不知道你一个接一个地添加它们是什么意思(
@Index()
调用,
列在查询中?)。是的,索引调用
/**
 * @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()
        ;
    }

...