php - 使用 Doctrine Query Builder 搜索多个列
问题描述
我的列包含以下形式的条目:
col1 | col2 | col3
dog 123 bunny
cat 456 table
bunny 789 laptop
我有一个搜索词。假设它是bunny
,那么我想返回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
, 返回该行中其他列的条目有点困惑和困惑。任何帮助,将不胜感激。
解决方案
LIKE
搜索会起作用,只是它们通常要慢得多,因为它们必须访问行而不是索引。在比较器的两边使用通配符可以保证它不会使用带有LIKE
^ 的索引。
但是,如果您使该字段FULLTEXT
可搜索,您将获得更好的搜索工具,包括子字符串匹配。MySQL 5.6 之后的版本也允许您FULLTEXT
在 InnoDB 上使用。
借用 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 %'
),它可以使用一个索引来表示 a LIKE
。
推荐阅读
- kubernetes - GCloud kubernetes cluster with 1 Insufficient cpu error
- amazon-web-services - Spark凭证链排序 - S3 Exception Forbidden
- reactjs - this.props.match.params 即使在传递参数时也是空的
- python - GCFS 写入超出配额并引发 HTTP 错误 429
- css - 日期、金额和总计的 CSS 对齐方式
- symfony - Symfony 4如何设置全局参数以在树枝中使用
- c# - iTextSharp - 合并一批 PDF 字节数组
- pyspark - 如何为我的数据框创建一个新列,其值是由不同列的值组成的映射?
- qt - 如何更改 QML Dial 中的圆形进度条?
- node.js - 如何确定 SFTP 文件是否是 Node.js 中的目录?