首页 > 解决方案 > 任意顺序的 PHP 搜索查询

问题描述

我有一个搜索功能,它能够搜索多个关键字。因此,例如,您的数据库中有“您很棒”,您可以通过搜索“您很棒”找到它,但是当您搜索“您很棒”时,它不会返回任何内容。所以基本上,如果你明白我的意思,你只能按照与数据库中相同的顺序进行搜索。我希望你们能帮助我解决这个问题。提前致谢!

控制器:

<?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 €&lt;/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。问题关闭。

标签: phpsymfonysearch

解决方案


尽管搜索引擎允许以不太复杂的方式进行操作,但还是有 SQL 方法:您可以使用RLIKE运算符而不是LIKE.

基本查询将如下所示SELECT * FROM tablename WHERE fieldname RLIKE 'you.*awesome'。请注意,RLIKE不使用任何索引(但在您上面的特定代码中LIKE也不会使用任何索引,因为表达式以通配符开头%


推荐阅读