У меня есть поиск, который работает, он может искать по нескольким ключевым словам. Так, например, у вас есть «You are awesome» в db, вы можете найти его, выполнив поиск «You awesome», но при поиске «Awesome are you» он ничего не вернет. Таким образом, вы можете выполнять поиск только в том же порядке, что и в базе данных, если вы понимаете, о чем я. Я надеюсь, что вы, ребята, можете мне с этим помочь. Заранее спасибо!
Контроллер:
<?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
]);
}
}
?>
Ветка:
{% 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>
{#Tabellen, tr aanpassen, td laten staan#}
<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>Vier de zomer %</th>
<th>Vier de zomer €</th>
<th>Opmerking</th>
</tr>
</thead>
<tbody>
{% for artikel in voorraad %}
{#Onderstaande wordt opgehaald vanuit je entiteit en die haalt het op uit je database. Niet aanpassen!#}
<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 %}
Я изучу ElasticSearch и queryBuilder. Вопрос закрыт.
@DenisAlimov Значит, нет возможности сделать это с помощью встроенных функций PHP?
разбить строку запроса пробелами => "you are awesome" => 3 слова "you" "are" "awesome". Затем выполните поиск по всем словам типа WHERE text LIKE $word1 OR text LIKE $word2 OR text LIKE $word3. Неэффективно, но в большинстве случаев будет работать
@DenisAlimov Я сделал это с помощью функции explode explode, добавил ее в цикл и сопоставил в запросе. Но это не дает мне возможности искать в другом порядке.
@ Мистер Дж. Я думаю, что нет лучшего способа, чем использовать LIKE, но вы можете делать все, что хотите, но это не будет действительно эффективно. 1. Я предлагаю вам использовать queryBuilder 2. Ваш первый запрос неверен (нет и между проверками) 3. Просто сгенерируйте все комбинации
@revengeance Спасибо за ответ, я посмотрю на queryBuilder. Тогда этот вопрос можно закрыть.
Что ж, QB не будет иметь большого значения, но он более читаемый, понятный imo.






Несмотря на то, что поисковые системы позволяют сделать это менее сложным способом, существует SQL-подход: вместо RLIKE можно использовать оператор LIKE.
Базовый запрос будет иметь вид SELECT * FROM tablename WHERE fieldname RLIKE 'you.*awesome'. Обратите внимание, что RLIKE не использует никаких индексов (но в вашем конкретном коде выше LIKE также не будет использовать какие-либо индексы, потому что выражения начинаются с подстановочного символа %)
вам следует использовать одну из поисковых систем, таких как Elasticsearch, SphinxSearch, Solr :)