Поисковый запрос PHP в любом порядке

У меня есть поиск, который работает, он может искать по нескольким ключевым словам. Так, например, у вас есть «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. Вопрос закрыт.

вам следует использовать одну из поисковых систем, таких как Elasticsearch, SphinxSearch, Solr :)

Denis Alimov 19.07.2018 13:18

@DenisAlimov Значит, нет возможности сделать это с помощью встроенных функций PHP?

Mr J. 19.07.2018 13:35

разбить строку запроса пробелами => "you are awesome" => 3 слова "you" "are" "awesome". Затем выполните поиск по всем словам типа WHERE text LIKE $word1 OR text LIKE $word2 OR text LIKE $word3. Неэффективно, но в большинстве случаев будет работать

Denis Alimov 19.07.2018 13:37

@DenisAlimov Я сделал это с помощью функции explode explode, добавил ее в цикл и сопоставил в запросе. Но это не дает мне возможности искать в другом порядке.

Mr J. 19.07.2018 14:44

@ Мистер Дж. Я думаю, что нет лучшего способа, чем использовать LIKE, но вы можете делать все, что хотите, но это не будет действительно эффективно. 1. Я предлагаю вам использовать queryBuilder 2. Ваш первый запрос неверен (нет и между проверками) 3. Просто сгенерируйте все комбинации

revengeance 19.07.2018 15:28

@revengeance Спасибо за ответ, я посмотрю на queryBuilder. Тогда этот вопрос можно закрыть.

Mr J. 19.07.2018 15:48

Что ж, QB не будет иметь большого значения, но он более читаемый, понятный imo.

revengeance 19.07.2018 17:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
7
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Несмотря на то, что поисковые системы позволяют сделать это менее сложным способом, существует SQL-подход: вместо RLIKE можно использовать оператор LIKE.

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

Другие вопросы по теме