У меня есть поиск, который работает, но проблема в том, что он может искать только то же самое, что и в базе данных. Я пытался реализовать mysql поиск по нескольким ключевым словам в любом порядке, но безуспешно. Я надеюсь, что вы, ребята, можете мне помочь, это решение для поиска по нескольким ключевым словам. Заранее спасибо!
Контроллер:
<?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
]);
}
}
?>
Twig (с формой поиска)
{% 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
]);
}
Я думаю, что добился некоторого прогресса, но он ищет только последнее ключевое слово, которое я думаю. Где я ошибаюсь?
@ DirkJ.Faber Возможно, я неправильно сформулировал свой вопрос, я имею в виду ввод для поиска. Например, у вас есть «assassins creed 4», должна быть возможность поиска с «creed assassins 4» или «assassins 4» и т. д.






Это больше вопрос дизайна базы данных, чем чистый Symfony / доктрина.
Если вам нужна сложная / гибкая поисковая система, вы должны использовать что-то вроде эластичного поиска.
В противном случае, если вы хотите, чтобы все слова были найдены, вы можете разделить их по словам (используя разнесение), а затем перебрать их, добавив 'и вроде «% $ word%»' к вашему запросу. Нарисуйте сторону, это также найдет строку, в которой есть меньшее значение слова, или слово конечной строки, в котором больше слов, чем то, что ищет пользователь.
Чтобы вернуться к эластичному поиску, он может выполнять нечеткий поиск и сортировку по благонравию и т. д. Так что вам не нужно творить магию на своей стороне. Вы должны это изучить.
Спасибо за ответ. На самом деле вариант разнесения - это то, что я ищу. Дело в том, что я пытался реализовать это, но безуспешно, я отредактировал пост, может, вы сможете взглянуть на него. заранее спасибо
Explode вернуть массив, который нужно зациклить и добавить каждый раздел
Я пробовал, но, похоже, ищет только последнее ключевое слово. Я отредактировал сообщение своим кодом.
Я дам вам полный пример, когда я нахожусь перед своим компьютером (сейчас на моем телефоне), но вам нужно зациклить ad 'и например: word1', (и например: word2 и т. Д ...). После вызова параметра set word1, word2 и т. д.
Итак, в основном я добавил функцию разнесения и некоторые параметры:
<?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
]);
}
}
?>
Вы устанавливаете заказ с помощью
ORDER BY a.omschrijving ASC. Если вы хотите заказать другой атрибут, измените эту часть.