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()
;
}
...