Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP Symfony搜索多个关键字_Php_Symfony_Search - Fatal编程技术网

PHP Symfony搜索多个关键字

PHP Symfony搜索多个关键字,php,symfony,search,Php,Symfony,Search,我有一个功能强大的搜索,但问题是它只能搜索与数据库中完全相同的内容。我曾试图实施,但没有成功。我希望你们能帮我解决搜索多个关键词的问题。提前谢谢 控制器: <?php namespace AppBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Sym

我有一个功能强大的搜索,但问题是它只能搜索与数据库中完全相同的内容。我曾试图实施,但没有成功。我希望你们能帮我解决搜索多个关键词的问题。提前谢谢

控制器:

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

    }

    ?>

我想我取得了一些进展,但它只搜索我认为最后一个关键字。我哪里出错了?

这更多的是一个数据库设计问题,而不是纯粹的符号/学说

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

另一种方法是,如果希望找到所有单词,可以按单词进行拆分(使用explode),然后在它们之间循环添加一个“和”%$word%”之类的词到查询中。这也会发现行中有更小的单词,或者fin行中的单词比用户要查找的单词多


为了回到弹性搜索中,它可以进行模糊搜索和相关性排序等。。。所以你不需要在你这边施魔法。你应该仔细研究一下。

分解返回一个数组,你需要循环并添加每个部分

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

所以基本上我添加了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
        ]);
    }

}

?>


您正在使用a.omschrijving ASC设置订单。如果你想在不同的属性上排序,请更改该部分。@DirkJ.Faber我的问题可能表述错误,我指的是搜索输入。例如,您有“刺客信条4”,必须能够使用“信条刺客4”或“刺客4”等进行搜索。谢谢您的回答。实际上,爆炸选项是我正在寻找的。问题是我试图实现它,但没有成功,我编辑了这篇文章,也许你可以看看。提前谢谢,我试过了,但似乎只搜索最后一个关键字。我用我的代码编辑了这篇文章。
/**
 * @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
    ]);
}
<?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
        ]);
    }

}

?>