Php 多栏多词搜索Symfony原则

Php 多栏多词搜索Symfony原则,php,mysql,doctrine,symfony1,Php,Mysql,Doctrine,Symfony1,我正在尝试创建一个多词搜索,它将查询表中的多个列。到目前为止,我的代码对于单个列非常有效,但正如您可以想象的那样,将其用于多个列将成为一个问题 如果我添加或where,它将不起作用,我真的不想创建更多for循环,因为它将变得非常麻烦。有什么想法吗 $query = $request->getParameter("article-search"); $keywords = explode(" ", $query); for( $i = 1; $i <= count( $keyword

我正在尝试创建一个多词搜索,它将查询表中的多个列。到目前为止,我的代码对于单个列非常有效,但正如您可以想象的那样,将其用于多个列将成为一个问题

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

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

for( $i = 1; $i <= count( $keywords ); $i++ ){
    $q->addWhere("a.title LIKE ?", "%" . $keywords[$i - 1] . "%");
}
$query=$request->getParameter(“文章搜索”);
$keywords=explode(“,$query”);
对于($i=1;$i addWhere($a.title LIKE?,“%”)$keywords[$i-1]。“%”);
}

< /代码> 也许您可以考虑使用“联合”,对于这样复杂的查询,我将使用本机SQL代替ORM实践。

< p>通常我会把它写成一个看起来像下面这样的查询:

$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
}
?>

我就是这样做的..也许这对某人有帮助

$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);
$now=“其他一些参数”;
$parts=分解(“,修剪($searchtext));
$子句=数组();
//这里设置了静态参数
$parameters=数组(
“:now”=>now美元
);
$i=0;
foreach($parts作为$part){
//对每个单词进行新的搜索查询和参数设置
$parameters[“:param.“$i]”=“%”$part.“%”;
如果($i==0){
$clauses=“v.description LIKE:param...$i.”或v.name LIKE:param...$i.”或v.sale LIKE:param...$i;
}否则{
$子句.=“或v.description,如:param.“$i.”或v.name,如:param.“$i.”或v.sale,如:param.“$i”;
}
$i++;
}
$qb->选择('v')
->from('MyBundle\Entity\Voucher','v')
->其中('v.date\u start=:now')
->andWhere($条款)
->设置参数($参数);

我以前曾经做过类似的事情,作为一个我可以重用的类。它太大了,不能在这里发布,但我会解释。开始构建一个“字符串”变量,不要尝试使用数据库方法构建。你会有几个循环需要解决。首先,当在多个列中搜索时,你会用“或”添加like'ss在它们之间。有一些词,您将对其进行拆分;建议使用preg_split()进行更多控制。对于每个词,您都希望限制搜索,因此在它们之间使用“AND”。请记住,您可能还有多个参数/条件,甚至有多个类型(字符串、int、日期)。我喜欢您的想法,我会随时向您发布:)这并不能解决问题。问题是针对多个列的多个术语。