PHP Symfony Поиск по нескольким ключевым словам

У меня есть поиск, который работает, но проблема в том, что он может искать только то же самое, что и в базе данных. Я пытался реализовать 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
    ]);
}

Я думаю, что добился некоторого прогресса, но он ищет только последнее ключевое слово, которое я думаю. Где я ошибаюсь?

Вы устанавливаете заказ с помощью ORDER BY a.omschrijving ASC. Если вы хотите заказать другой атрибут, измените эту часть.

Dirk J. Faber 18.07.2018 12:07

@ DirkJ.Faber Возможно, я неправильно сформулировал свой вопрос, я имею в виду ввод для поиска. Например, у вас есть «assassins creed 4», должна быть возможность поиска с «creed assassins 4» или «assassins 4» и т. д.

Mr J. 18.07.2018 12:12
Стоит ли изучать 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
2
636
4

Ответы 4

Это больше вопрос дизайна базы данных, чем чистый Symfony / доктрина.

Если вам нужна сложная / гибкая поисковая система, вы должны использовать что-то вроде эластичного поиска.

В противном случае, если вы хотите, чтобы все слова были найдены, вы можете разделить их по словам (используя разнесение), а затем перебрать их, добавив 'и вроде «% $ word%»' к вашему запросу. Нарисуйте сторону, это также найдет строку, в которой есть меньшее значение слова, или слово конечной строки, в котором больше слов, чем то, что ищет пользователь.

Чтобы вернуться к эластичному поиску, он может выполнять нечеткий поиск и сортировку по благонравию и т. д. Так что вам не нужно творить магию на своей стороне. Вы должны это изучить.

Спасибо за ответ. На самом деле вариант разнесения - это то, что я ищу. Дело в том, что я пытался реализовать это, но безуспешно, я отредактировал пост, может, вы сможете взглянуть на него. заранее спасибо

Mr J. 18.07.2018 15:22

Explode вернуть массив, который нужно зациклить и добавить каждый раздел

Я пробовал, но, похоже, ищет только последнее ключевое слово. Я отредактировал сообщение своим кодом.

Mr J. 18.07.2018 15:36

Я дам вам полный пример, когда я нахожусь перед своим компьютером (сейчас на моем телефоне), но вам нужно зациклить 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
        ]);
    }

}

?>

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