我有包含以下形式的条目的列:
col1 | col2 | col3
dog 123 bunny
cat 456 table
bunny 789 laptop
我有一个搜索词。假设它是bunny
,那么我想返回在其任何列中包含单词bunny
的所有行。在本例中,这将是第 1 行和第 3 行。
所有列的格式均为:
/**
* @ORMColumn(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
匹配,返回该行中其他列的条目有点卡住和困惑。任何帮助将不胜感激。
LIKE
搜索都可以,只是它们通常要慢得多,因为它们必须访问行而不是索引。在比较器的两边使用通配符可以保证它不会使用带有LIKE
^ 的索引。
但是,如果使字段FULLTEXT
可搜索,则可以获得更好的搜索工具,包括子字符串匹配。5.6之后的MySQL也允许你在InnoDB上使用FULLTEXT
。
借用弗兰克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
。
在你的存储库类中类似的东西。
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 原则:模式:更新 --强制