我的搜索功能正常,但问题是它只能搜索与数据库中完全相同的内容。我尝试实现mysql multiple keyword search in any order,但没有成功。我希望你们能为我提供帮助的是一种搜索多个关键字的解决方案。预先感谢!
控制器:
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class VoorraadlijstenController extends Controller
{
/**
* @Route ("/voorraadlijst", name="voorraadlijst")
*/
public function voorraadlijstHomepage(Request $request){
//Variabelen
$search = $request->get('q');
$em = $this->getDoctrine()->getManager();
//Ophalen van data uit database.
if ($search) {
$voorraad = $em->createQuery('Select a FROM AppBundle:Voorraadlijst a WHERE a.artikelnummer LIKE :query OR a.omschrijving LIKE :query ORDER BY a.omschrijving ASC')
->setParameter('query', '%'.$search.'%');
}
else {
$voorraad = $em->createQuery('Select a FROM AppBundle:Voorraadlijst a ORDER BY a.omschrijving ASC');
}
//Verwijzing naar overzicht & en variabelen die hij meegeeft
return $this->render('voorraadlijst.html.twig', [
'voorraad' => $voorraad->getResult(),
'q' => $search
]);
}
}
?>
嫩枝(带有搜索表)
{% extends 'layout/default.html.twig' %}
{% block content %}
{#Style voor de wrapper#}
<style>
.wrapper {
height: 130px;
min-height: 150px
margin: 10px;
padding: 30px;
}
table {
table-layout: fixed;
zoom: 80%
}
{#Style voor de zoekformulier#}
.zoekformulier{
padding: 20px;
margin-top: 20px;
}
</style>
{#Heading#}
<div class="wrapper" style="background-color:#E9ECEF">
<div class="container">
<h3 class="display-4"><center>Voorraadlijst week 29</center></h3>
</div>
</div>
{#Zoekformulier#}
<div class= "zoekformulier">
<form>
<input name="q" value="{{ q }}" placeholder="Artikelnummer of omschrijving" />
<button type="submit">Zoeken</button>
</form>
</div>
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<table class="table table-striped">
<thead>
<tr>
<th scope="col">Artikelnummer</th>
<th>Omschrijving</th>
<th>Adviesprijs</th>
<th>Nu beschikbaar</th>
<th>Eerste LEV Verwacht</th>
<th>Beschikbaar na eerste LEV</th>
<th>Tweede LEV Verwacht</th>
<th>Beschikbaar na tweede LEV</th>
<th>Derde LEV Verwacht</th>
<th>Beschikbaar na derde LEV</th>
<th>Korting %</th>
<th>Korting €</th>
<th>Opmerking</th>
</tr>
</thead>
<tbody>
{% for artikel in voorraad %}
<tr>
<th scope="row">{{ artikel.artikelnummer }}</th>
<td>{{ artikel.omschrijving }}</td>
<td>{{ artikel.adviesprijs }}</td>
<td>{{ artikel.nuBeschikbaar }}</td>
<td>{{ artikel.eersteLevVerwacht }}</td>
<td>{{ artikel.beschikbaarNaEersteLev }}</td>
<td>{{ artikel.tweedeLevVerwacht }}</td>
<td>{{ artikel.beschikbaarNaTweedeLev }}</td>
<td>{{ artikel.derdeLevVerwacht }}</td>
<td>{{ artikel.beschikbaarNaDerdeLev }}</td>
<td>{{ artikel.kortingProcent }}</td>
<td>{{ artikel.kortingEuro }}</td>
<td>{{ artikel.opmerking }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<hr>
</div>
{% endblock %}
编辑:我试图实现爆炸功能:
/**
* @Route ("/voorraadlijst", name="voorraadlijst")
*/
public function voorraadlijstHomepage(Request $request){
//Variabelen
$search = explode(" ", $request->get('q'));
$em = $this->getDoctrine()->getManager();
$waarde = '';
foreach ($search as $key => $value) {
$waarde .= ' AND a.omschrijving LIKE "%'.$value.'%"';
}
if ($search) {
$voorraad = $em->createQuery('Select a FROM AppBundle:Voorraadlijst a WHERE a.artikelnummer LIKE :query OR a.omschrijving LIKE :query ORDER BY a.omschrijving ASC')
->setParameter('query', '%'.$value.'%');
}
else {
$voorraad = $em->createQuery('Select a FROM AppBundle:Voorraadlijst a ORDER BY a.omschrijving ASC');
}
//Verwijzing naar overzicht & en variabelen die hij meegeeft
return $this->render('voorraadlijst.html.twig', [
'voorraad' => $voorraad->getResult(),
'q' => $value
]);
}
我认为我取得了一些进步,但是它仅搜索我认为的最后一个关键字。我要去哪里错了?
答案 0 :(得分:1)
这比纯Symfony /学说更多的是数据库设计问题。
如果您想要复杂/灵活的搜索系统,则应使用弹性搜索之类的方法。
否则,如果您希望找到所有单词,则可以按单词拆分(使用爆炸),然后遍历它们,在查询中添加一个“并且像“%$ word%”一样”。在这方面,还可以找到其中单词词号较小的行,或者查找比用户要查找的单词更多的鳍行词。
要回到弹性搜索中,它可以进行模糊搜索并通过相关性进行排序等。因此,您无需做任何魔术。您应该调查一下。
答案 1 :(得分:0)
分解返回需要循环的数组并添加每个部分
答案 2 :(得分:0)
当我在电脑前时(现在在手机上),我将给您提供一个完整的示例,但是您需要循环播放广告'and::word1',(以及:word2等)。调用设置参数word1,word2等后。
答案 3 :(得分:0)
所以基本上我添加了explode函数和一些参数:
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class VoorraadlijstenController extends Controller
{
/**
* @Route ("/voorraadlijst", name="voorraadlijst")
*/
public function voorraadlijstHomepage(Request $request){
//Variabelen
$zoek = $request->get('q');
$search = explode(" ", $request->get('q'));
$em = $this->getDoctrine()->getManager();
$waarde = '';
foreach ($search as $key) {
$waarde .= '%'.$key.'%';
}
$parameter = [];
$parameters['query1'] = '%'.$zoek.'%';
$parameters['query2'] = '%'.$waarde.'%';
//Ophalen van data uit database.
if ($search) {
$voorraad = $em->createQuery('Select a FROM AppBundle:Voorraadlijst a WHERE a.artikelnummer LIKE :query1 OR a.omschrijving LIKE :query2 ORDER BY a.omschrijving ASC')
->setParameters($parameters);
}
else {
$voorraad = $em->createQuery('Select a FROM AppBundle:Voorraadlijst a ORDER BY a.omschrijving ASC');
}
//Verwijzing naar overzicht & en variabelen die hij meegeeft
return $this->render('voorraadlijst.html.twig', [
'voorraad' => $voorraad->getResult(),
'q' => $zoek
]);
}
}
?>