使用原则查询生成器搜索多个列



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

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

相关内容

  • 没有找到相关文章

最新更新