使用 Doctrine Query Builder 搜索多列
Search for multiple columns with Doctrine Query Builder
我的列包含以下形式的条目:
col1 | col2 | col3
dog 123 bunny
cat 456 table
bunny 789 laptop
我有一个搜索词。假设它是 bunny
,那么我想 return 在其任何列中包含单词 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
匹配到 return 该行中其他列的条目感到有点困惑和困惑。任何帮助将不胜感激。
你的知识库中有这样的东西 class。
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 doctrine:schema:update --force
LIKE
搜索将起作用,只是它们通常要慢得多,因为它们必须访问行而不是索引。在比较器的两边使用通配符保证它不会使用带有 LIKE
^ 的索引。
但是,如果您使字段 FULLTEXT
可搜索,您将获得更好的搜索工具,包括子字符串匹配。 MySQL 5.6 之后也允许你在 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 %'
),它可以使用索引LIKE
.
我的列包含以下形式的条目:
col1 | col2 | col3
dog 123 bunny
cat 456 table
bunny 789 laptop
我有一个搜索词。假设它是 bunny
,那么我想 return 在其任何列中包含单词 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
匹配到 return 该行中其他列的条目感到有点困惑和困惑。任何帮助将不胜感激。
你的知识库中有这样的东西 class。
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 doctrine:schema:update --force
LIKE
搜索将起作用,只是它们通常要慢得多,因为它们必须访问行而不是索引。在比较器的两边使用通配符保证它不会使用带有 LIKE
^ 的索引。
但是,如果您使字段 FULLTEXT
可搜索,您将获得更好的搜索工具,包括子字符串匹配。 MySQL 5.6 之后也允许你在 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 %'
),它可以使用索引LIKE
.