2016-02-12 118 views
1

我想制作一个多字搜索,将查询表中的多个列。到目前为止,我的代码对于单个列的效果很好,但正如您可以想象的那样,使用它以获得更多的一列成为问题。多栏搜索多栏Symfony Doctrine

如果我添加orWhere它不会工作,我不想创建更多的循环,因为它会变得非常繁琐。有任何想法吗?

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

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

我在过去做过这样的事情,作为我重用的类。张贴在这里太大了,但我会解释。开始构建一个“字符串”变量,不要尝试使用数据库Merhods构建。你将有几个循环来解决问题。首先,当跨多个列进行搜索时,您会在它们之间添加LIKE与“OR”。那里有你会分裂的词语;建议使用preg_split()进行更多控制。对于每个单词,您都需要限制搜索,所以在它们之间使用“AND”。请记住,您可能还有多个参数/条件甚至类型(字符串,整数,日期)。 – jjwdesign

回答

-1

也许你可以考虑使用“联盟”?另外,对于这样复杂的查询,我会使用本机SQL而不是ORM实践。虽然我不知道你是如何实现与查询建设的工具,你必须有

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

0

通常我会写这样的查询,看起来像下面。

这里有一个简单的例子,可以帮助建立使用关键字的数组查询的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 
} 
?> 

让我知道如果有什么我可以澄清这里

+1

我喜欢你的想法去的地方,生病让你张贴:) – seus

+0

这并没有解决这个问题。这个问题是针对多个专栏的多个术语。 – RichieHH

2

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

$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);