【问题标题】:PHP Symfony Search multiple keywordsPHP Symfony 搜索多个关键字
【发布时间】:2018-07-18 08:46:02
【问题描述】:

我有一个搜索功能,但问题是它只能搜索与数据库中完全相同的内容。我试图实现mysql multiple keyword search in any order,但没有成功。我希望你们能帮助我的事情是搜索多个关键字的解决方案。提前致谢!

控制器:

    <?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 设置您的订单。如果您想订购不同的属性,请更改该部分。
  • @DirkJ.Faber 我的问题可能表述错误,我的意思是搜索输入。例如你有“刺客信条4”,它必须可以搜索“信条刺客4”或“刺客4”等。

标签: php symfony search


【解决方案1】:

这更像是一个数据库设计问题,而不是纯粹的 Symfony/doctrine。

如果你想要复杂/灵活的搜索系统,你应该使用弹性搜索之类的东西。

如果您希望找到所有单词,则可以按单词拆分(使用explode),然后循环遍历它们,在查询中添加'and like "%$word%" '。画边这也将找到其中单词的较小部分的行或包含比用户正在查找的单词更多的单词的最终行单词。

要返回弹性搜索,它可以进行模糊搜索和排序等...所以你不需要在你身边做任何魔法。你应该调查一下。

【讨论】:

  • 感谢您的回答。实际上,爆炸选项是我正在寻找的。问题是我试图实现它但没有成功,我已经编辑了帖子也许你可以看看它。提前致谢
【解决方案2】:

爆炸返回一个你需要循环并添加每个部分的数组

【讨论】:

  • 我试过了,但它似乎只搜索最后一个关键字。我用我的代码编辑了帖子。
【解决方案3】:

当我在电脑前(现在在手机上)时,我会给你一个完整的例子,但你需要循环 ad 'and like :word1',(and like :word2, etc...)。调用后设置参数 word1、word2 等

【讨论】:

    【解决方案4】:

    所以基本上我添加了explode函数和一些参数:

    <?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
            ]);
        }
    
    }
    
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      • 1970-01-01
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      相关资源
      最近更新 更多