【问题标题】:Multi word search on multiple columns Symfony Doctrine多列上的多词搜索 Symfony Doctrine
【发布时间】:2016-05-23 00:45:30
【问题描述】:

我正在尝试制作一个多词搜索,它将查询表中的多个列。到目前为止,我的代码在单列上运行良好,但正如您可以想象的那样,将它用于多列会成为问题。

如果我添加 orWhere 它将不起作用,我真的不想创建更多 for 循环,因为它会变得非常麻烦。有什么想法吗?

$query = $request->getParameter("article-search");
$keywords = explode(" ", $query);

for( $i = 1; $i <= count( $keywords ); $i++ ){
    $q->addWhere("a.title LIKE ?", "%" . $keywords[$i - 1] . "%");
}

【问题讨论】:

  • 我在过去作为一个我重用的类做过类似的事情。它太大了,无法在这里发布,但我会解释一下。开始只构建一个“字符串”变量,不要尝试使用 Database Merhods 构建。您将有几个循环需要解决。首先,在跨多个列进行搜索时,您将在它们之间添加带有“OR”的 LIKE。有的话,你会分裂;建议使用 preg_split() 进行更多控制。对于每个单词,您都需要限制搜索,因此在它们之间使用“AND”。请记住,您可能还有多个参数/条件甚至类型(字符串、整数、日期)。

标签: php mysql doctrine symfony1


【解决方案1】:

我只是这样做了。也许它可以帮助某人..

$now = "some other parameter";

$parts = explode(" ",trim($searchtext));
$clauses=array();
// static paramtter setted here
$parameters = array(
    ':now' => $now
);

$i = 0;
foreach ($parts as $part){
    // for every word make new search query and parameter
    $parameters[":param".$i] = "%".$part."%";
    if($i == 0){
        $clauses  = "v.description LIKE :param".$i." OR v.name LIKE :param".$i." OR v.sale LIKE :param".$i;
    } else {
        $clauses .= " OR v.description LIKE :param".$i." OR v.name LIKE :param".$i." OR v.sale LIKE :param".$i;
    }
    $i ++;
}

$qb->select('v')
    ->from('MyBundle\Entity\Voucher', 'v')
    ->where('v.date_start <= :now')
    ->andWhere('v.date_end >= :now')

    ->andWhere($clauses)
    ->setParameters($parameters);

【讨论】:

    【解决方案2】:

    通常我会将其编写为如下所示的查询:

    $query = "`where column like '%$keywordOne%' or column like '%keywordTwo%'`";
    

    虽然我不确定您如何使用那里的查询构建工具来实现它。

    这是一个简单的示例,它可能有助于使用您拥有的关键字数组构建查询的 where 部分:

    <?php
    $keywords = array("bing", "bang", "jump");
    
    $query_start = 'where colummName';
    $like_portion = "like '%" . implode("%' or columnName like '%", $keywords) . "%'";
    
    if(sizeof($keywords) > 0) {
        echo "`$query_start $like_portion`";
    } else {
        // No keywords
    }
    ?>
    

    如果有什么我可以在这里澄清的,请告诉我

    【讨论】:

    • 我喜欢你的想法,我会一直告诉你:)
    • 这并不能解决问题。问题是针对多个列的多个术语。
    【解决方案3】:

    也许您可以考虑使用“联合”?另外,对于这样复杂的查询,我会使用原生 SQL 而不是 ORM 实践。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-16
      • 2021-11-24
      • 2015-11-02
      • 1970-01-01
      相关资源
      最近更新 更多